その他
よく使うコマンド
- wc … 文字数、行数のカウント
- sort … ソート
- uniq … 重複する文字列の削除
- head … ファイルの先頭表示
- tail … ファイルの末尾表示
- cut … 行から列を取り出す
サンプル。ホームディレクトリでディスク使用率が高いディレクトリを10表示
$ ls -l ~ | sort -rn +4 | head -10
正規表現を使える代表的なコマンド
- grep … 行検索, egrep
- awk … 文字列置換
- sed … 文字列の検索と置換
- tr … 文字の置換
ディレクトリコピー
ディレクトリをコピーする方法はいろいろとあります。ここでは、tarとパイプ機能を組み合わせる方法を紹介します。
この例では、directory1のファイルをすべてdirectory2にコピーしています。
$ cd directory1
$ mkdir ../directory2
$ tar -cf - . | (cd ../directory2; tar -xf - )
指定したフィールドを集計計算する
指定したフィールドを集計計算するには、次のようにします。 AWKを使っています。
#!/bin/sh
#
# 名称 :addcolumn
# 書式 :addcolumn [column]
# 解説 :標準入力からのデータの何番目かのフィールドを足し算する
# フィールドの指定がなければ1番目のフィールドを使う
# 戻り値:0 ... 正常終了, 1 ... ユーザの指定間違い
#
CMDNAME=`basename $0`
if [ $# -gt 1 ]; then
echo "Usage: $CMDNAME [column]" 1>&2
exit 1
fi
COLUMN=#{1:-1}
expr "$COLUMN" + 1 >/dev/null 2>&1
if [ $? -ge 2 ]; then
echo "Usage: $CMDNAME argument is not numeric." 1>&2
exit 1
fi
awk '{total+=$'$COLUMN'} END {print total}'
CSVから指定した列の値を抽出
このスクリプトではPerlを使っています。map は、データを変換処理してから配列に格納するための関数です。。「配列名=map {変換式} データ」という書式で使用します。
変換式は「パターン ? A : B」という形式になっています。 データは (/(C|D),/g) という形式になっています。
変換式から見てみましょう。パターンでは、「”」で始まり「”」で終わる文字列を表現するため「^”(.*)”$」としています。「^」が行頭「$」が行末を意味します。「(.*)」が任意の文字列を意味します。これに一致する場合は「(.*)」の部分をscalar関数へ渡しています。scalar関数では「”"」を「”」に置き換えています。「”」で始まり「”」で終わる文字列でない場合は、「$_」でそのままにしています。
データ部分の「[^,"]*」は「,」「”」を含まない文字列を意味します。例えば、「[0-9]」と書くと数字になり、「[^0-9]」と書くと数字以外に一致します。このように「^」は「[]」の中の先頭で使うと否定の意味になります。”(?:”"|[^"])*”は「”」で始まり「”」で終わり、「”」に挟まれる文字列が「(?:”"|[^"])*」に一致する文字列を意味します。「(?:”"|[^"])*」は「”"」または「”以外の文字」を意味します。
1. ファイル名の取得
2. 第二引数には取得したいカラムの番号を指定。0から始めて数えるよう1を引いて変換
3. ファイルのオープン
4. 変数vの初期化
5. 入力ファイルの行がなくなるまで繰り返し
5.1. 行末の改行コードを削除。$_ は読み込まれた行が格納される暗黙の変数
5.2. 行末にコンマを追加。 a .= b は文字列連結 a = a+b と同じ
5.3. 各列の値を配列変数 csv へ格納
5.4. 指定された列の値と改行コードを変数 v へ追加
6. ファイルのクローズ
7. v の出力
#!/usr/bin/perl
$fname = $ARGV[0];
$c = $ARGV[1] - 1;
open(FILE, $fname);
$v="";
while (<FILE>) {
chomp($_);
$_ .= ",";
@csv = map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_} (/([^,"]*|"(?:""|[^"])*"),/g);
$v .= "$csv[$c]\n";
}
close(FILE);
print $v;