web-dev-qa-db-ja.com

最初の行を除いてawkの出力をソートしますか?

これは、CSVファイルの解析で頻繁に発生するユースケースです。シェルスクリプトに埋め込まれたインラインawkスクリプトの場合、次の回避策を使用できます。

myfile="$(mktemp)"
awk '(awk script here)' > "$myfile"
head -1 "$myfile"
sed 1d "$myfile" | sort
rm "$myfile"

(または、BSDmktemp用の適切なmktempテンプレートを使用します; GNU上記のように機能します。)

ただし、Shebang #!/bin/awk -fを使用して本格的なawkスクリプトを作成する場合、出力を並べ替えるこの1つの要素を処理するためだけに、シェルスクリプトに変更する必要はありません。

どうすればawkでこれを行うことができますか?または、awkにネイティブの並べ替え関数がない場合、awkパイプラインについてどこで学ぶことができ、パイプラインを使用してシェバンを変更せずにこれを実現するにはどうすればよいですか?

5
Wildcard

これは、最初の行を除くすべての行を並べ替える例です。

#!/bin/awk -f
BEGIN{cmd="sort"}
NR==1{print;next}
{print $1,$2 | cmd}
END{close(cmd)}

このファイルについて考えてみましょう。

$ cat file
Letter  Value
A       12
D       10
C       15
B       13

次に:

$ awk -f script.awk file
Letter  Value
A 12
B 13
C 15
D 10

最初の入力行は最初の出力行です。残りの行はソートされます。

7
John1024