a.txtとb.txtという2つのテキストファイルがあります。
a.txt
1
2
3
4
5
b.txt
3
5
一致する数字は「0」として印刷され、一致しない数字は「1」で印刷されるc.txtが必要です。
1
1
0
1
0
私はcommが行だけを抑制/印刷できることを知っていますが、上記のc.txtをどのように取得できますか?
とても感謝しています。
答え1
diff
参加せずに混合したい場合は、ここに別のオプションがあります。
sdiff -l a.txt b.txt | sed -e 's/.*<.*/1/' -e 's/.*(.*/0/'
sed
そこでより良い表現を得るか、次のように変更することもできますが、awk
これはクイックショットなので、次にリダイレクトするだけです。c.txt
答え2
don_crisstiが指摘したように、awk
非常に簡単です。
awk 'FNR==NR { match_nmbrs[$1]++; next;}
{if($1 in match_nmbrs)
print 0;
else
print 1; }
' b.txt a.txt
最初の{...}
条件は最初のファイルのレコードにのみ適用され、2番目の条件{...}
は2番目のファイルのレコードにのみ適用されます。私の考えでは、他のすべては説明が必要です。
答え3
awk
出力に使用comm
:
$ comm a.txt b.txt | awk -F'\t' '$1 || $2 { print 1 } $3 { print 0 }'
comm
タブで区切られた3つの列を出力します。
- 最初のファイルの行のみ、
- 2番目のファイルの行のみ
- その行は両方のファイルに存在します。
スクリプトawk
は、最初の2つの列に項目を含むすべての入力を「一致しない」として分類して出力し、3番目の列に項目が含まれている場合は一致を出力します1
。0
comm
両方のファイルを並べ替える必要があります。
答え4
ここに別のawk
解決策があります
awk '1,$0=system("grep -qx "$1" b.txt")' a.txt