次の2つのテキストファイルがあります。
ㅏ
1111|100|11/11/1111|a
2222|200|11/11/1111|a
3333|300|11/11/1111|a
4444|400|11/11/1111|a
第二
1111|100|11/11/1111|a
1111|100|11/11/1111|a
2222|200|11/11/1111|a
3333|300|11/11/1111|a
5555|500|11/11/1111|a
私は次のコマンドを使用しました
awk -F"|" '{ printf "%4s|%3s|\n",$1,$2 }' a | grep -v -f /dev/stdin b
任意の出力....
5555|500|11/11/1111|a
予想される出力は次のとおりです。
1111|100|11/11/1111|a
5555|500|11/11/1111|a
どうすればいいですかgrep
?awk
答え1
grep
実際には、ファイルを比較する代わりに、特定の形式の正規表現に一致する個々の行を抽出するために使用されるため、これには適していません。ある一致を返さず、別の一致(ファイルの最初の2行b
)を削除します。
あなたが使用できるcomm
:
$ comm -13 a b
1111|100|11/11/1111|a
5555|500|11/11/1111|a
これはcomm
ソートされた入力データに依存します。
comm
上記のコマンドは、-13
基本出力の最初と3番目の列を削除します。デフォルトでは、最初のファイルの列1の行のみを出力し、2番目のファイルの列2の行のみを出力し、最後の列の共通行のみを出力します(マニュアルの基本ケース参照、最初のファイルの行のみを出力comm
します)。 1列のファイル、2列の2番目のファイルにのみある行、最後の列の共通行(参照:標準ユーティリティ):
$ comm a b
1111|100|11/11/1111|a
1111|100|11/11/1111|a
2222|200|11/11/1111|a
3333|300|11/11/1111|a
4444|400|11/11/1111|a
5555|500|11/11/1111|a
答え2
配列配列に対してGNU awkとARGINDを使用してソートされていないファイルの数を比較するより一般的な方法:
$ cat tst.awk
BEGIN { OFS="\t" }
{ cnt[$0][ARGIND]++ }
END {
for (str in cnt) {
for (fileNr=1; fileNr<=ARGIND; fileNr++) {
printf "%d%s", cnt[str][fileNr], OFS
}
print str
}
}
$ awk -f tst.awk a b
1 2 1111|100|11/11/1111|a
1 1 2222|200|11/11/1111|a
1 1 3333|300|11/11/1111|a
1 0 4444|400|11/11/1111|a
0 1 5555|500|11/11/1111|a
上記は、指定された文字列が最初のファイルに表示される回数、2番目のファイルに表示される回数など、すべてのファイルの各一意の文字列を示しています。
必要な結果を得るには、次のようにします。
$ awk -f tst.awk a b | awk '$2>$1' | cut -f3-
1111|100|11/11/1111|a
5555|500|11/11/1111|a