内部ファイルがあります
11111
444
989
5512
121318
だから、次のようなoutfileを生成するawkコマンドを配置したいと思います。outfile has ${thesemany} matches
この場合、outfile
次のようになります。
outfile has 2 matches
11111
121318
ブロックを試してみる必要があるようですが、END
この行は最初になければなりません。BEGIN
&ブロックと増分演算子を挿入する場所がEND
混乱しすぎます。
私のものは不完全ですawk-one-liner
awk 'BEGIN {print "outfile has ${thesemany} matches"} {(length($1) >= 5) print $1}' infile > outfile
答え1
以前に一致したアイテムの数が不明であることを考えると、その後に一致アイテム自体を印刷するには、そのアイテムを1END
に保存する必要があります。たとえば、次のようになります。END
awk '
length($1) >= 5 {matches = matches (matches ? ORS : "") $1; count++}
END {print "outfile has " count+0 " matches"; if(count) print matches}
' infile
出力順序に興味がない場合、または一致する項目をソートしたい場合は、連結文字列の代わりに配列に保存できます。
1次のように外部から一致をバッファリングできると思います。awk 'length($1) >= 5 {count++; print $1 | "cat"} END {print "outfile has " count+0 " matches"; close("cat")}' infile
答え2
一致するすべてのフィールドを一時配列に保存し、ENDルールに配列をダンプできます。
awk 'length($1) >= 5 {a[$1]; count++; } END {print "outfile has", count, "matches"; for (elem in a) {print elem}}' infile