awk
有用なワンライナー - CSVなどから平均を計算する
サーチ…
ロバストな表データの処理(CSVなど)
入力が正しくフォーマットされていれば、表形式のデータをawkで処理するのは非常に簡単です。表形式のデータを生成するほとんどのソフトウェアは、この形式の形式の特定の機能を使用します。表形式のデータを処理するawkプログラムは、特定のソフトウェアによって生成されるデータに固有のものがあります。より一般的で堅牢なソリューションが必要な場合、ほとんどの一般的な言語は、表形式のデータに含まれる多くの機能を備えたライブラリを提供します。
- 最初の行のオプションの列名
- 引用符付きおよび引用符なしの列値の混合
- さまざまな区切り文字
- 浮動小数点数のローカライズされたフォーマット
これらすべての機能をawkできれいにかつ包括的に処理することは間違いありませんが、これはおそらく努力する価値がありません。
表形式のデータで2つの列を交換する
与えられたファイルを指定し;列区切り記号として使用します。第1および第2のカラムのパーミュテーションは、
awk -F';' -v 'OFS=;' '{ swap = $2; $2 = $1; $1 = swap; print }'
表形式のデータから列の値の平均を計算する
与えられたファイルを指定し;列区切り記号として使用します。 2番目の列の値の平均を次のプログラムで計算します。入力は学生グループの成績のリストです。
awk -F';' '{ sum += $2 } END { print(sum / NR) }' <<EOF
Alice;2
Victor;1
Barbara;1
Casper;4
Deborah;0
Ernest;1
Fabiola;4
Giuseppe;4
EOF
このプログラムの出力は2.125です。
NRは処理されている行の番号を保持していることを忘れないでください。したがって、 ENDブロックにはファイル内の行の総数が格納されます。
多くのアプリケーション(監視、統計情報)では、中央値がはるかに有用な情報であることに注意してください。対応する例を参照してください。
表形式データ内の特定の列の選択
私たちはファイルを仮定します。列区切り記号として使用します。特定の列のセットを選択するには、 printステートメントが必要です。たとえば、次のプログラムは、入力から列3,4、および7を選択します。
awk -F';' -v 'OFS=;' '{ print $3, $4, $7 }'
印刷する行をより慎重に選択することは、通常通り可能です。次のプログラムは、最初のフィールドがAliceまたはBob場合、その入力から列3,4,7を選択します。
awk -F';' -v 'OFS=;' '($1 == "Alice") || ($1 == "Bob") { print $3, $4, $7 }'
表形式のデータから列の値の中央値を計算する
与えられたファイルを指定し;列区切り記号として使用します。 2列目の値の中央値は、 GNU awk用に書かれた次のプログラムで計算します。提供された入力は、学生グループの成績のリストです:
gawk -F';' '{ sample[NR] = $2 }
END {
asort(sample);
if(NR % 2 == 1) {
print(sample[int(NR/2) + 1])
} else {
print(sample[NR/2])
}
}' <<EOF
Alice;2
Victor;1
Barbara;1
Casper;4
Deborah;0
Ernest;1
Fabiola;4
Giuseppe;4
EOF
このプログラムの出力は1です。
NRは処理されている行の番号を保持していることを忘れないでください。したがって、 ENDブロックにはファイル内の行の総数が格納されます。
awkの多くの実装は配列をソートする関数を持っていないので、上のコードを使う前に定義する必要があります。
2つのパターン間の線のセットを選択する
パターンマッチングは、 awkがそれに続くアクション、すなわち{ pattern } { action }制御するときに効果的に使用できます。パターンマッチングのひとつのクールな使用は言うファイルに2つのパターンの複数を選択することですpatternAとpatternB
$ awk '/patternA/,/patternB/' file
私のファイルの内容が次の通りであると仮定し、上のパターンの間だけの線を抽出したい。
$ cat file
This is line - 1
This is line - 2
patternA
This is line - 3
This is line - 4
This is line - 5
patternB
This is line - 6
$ awk '/patternA/,/patternB/' file
patternA
This is line - 3
This is line - 4
This is line - 5
patternB
上記のコマンドは、一致する行を印刷する以外には特定の{ action }実行しませんが、行のサブセット内の特定のアクションはアクションブロック( {} )で適用できます。