
2 つのファイルがあります:
ファイル1の内容は次のとおりです。
1 2 3 4 5 6 7 8 10
ファイル2の内容は次のとおりです。
1
2
3
4
5
6
7
8
9
10
2 つのファイルの違いを見つけて奇数を出力し、それがどのファイルからのものであるかを示すにはどうすればよいでしょうか。
例えば、この場合、9
File2にのみ表示されます。コマンドを実行して、次のような出力を取得するにはどうすればよいでしょうか。
9 is only in File2
答え1
きれいなフォーマット(スペース x 改行)がある場合は、次のように行を行に変換して比較するのが最も簡単です。
diff <( sed -e "s/ /\n/g" h.txt ) v.txt
h.txt
水平ファイルとv.txt
垂直ファイルはどこですか?
答え2
(G)AWK を使用するとよいでしょう:
違いを見つけるには、まず AWK を使用して file1.txt を行単位の表現に変換し、次にその結果を diff にパイプします。
gawk 'BEGIN {FS = " "} ; {for(i=1; i<=NF; i++) print $i}' file1.txt | diff file2.txt -
答え3
それを実行する方法は複数あります。ここにありますcomm
。
まず、の出力printf
を解釈するためのヘッダー(要求されたファイル名を指定) を作成し、次にソートされた入力に対して を実行し、両方のファイルに存在する行を抑制します ( )。 への 2 つの入力はプロセス置換であり、ここでは don_crissti の提案を使用して のスペースを改行に変換します。次に、両方のファイルを に渡します。これには次のものが必要です。comm
comm
-3
comm
tr
File1
sort
comm
printf "File1\tFile2\n"; comm -3 <(tr ' ' '\n' < File1 | sort) <(sort File2)
サンプル実行
入力ファイル1:
1 2 3 4 5 6 7 8 10 11
入力ファイル2:
1
2
3
4
5
6
7
8
9
10
出力:
$ printf "File1\tFile2\n"; comm -3 <(sed 's/ /\n/g' File1 |sort ) <(sort File2)
File1 File2
11
9