2つのファイルの内容を水平方向と垂直方向に比較する

2つのファイルの内容を水平方向と垂直方向に比較する

2 つのファイルがあります:

ファイル1の内容は次のとおりです。

1 2 3 4 5 6 7 8 10

ファイル2の内容は次のとおりです。

1
2
3
4
5
6
7
8
9
10

2 つのファイルの違いを見つけて奇数を出力し、それがどのファイルからのものであるかを示すにはどうすればよいでしょうか。

例えば、この場合、9File2にのみ表示されます。コマンドを実行して、次のような出力を取得するにはどうすればよいでしょうか。

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 の提案を使用して のスペースを改行に変換します。次に、両方のファイルを に渡します。これには次のものが必要です。commcomm-3commtrFile1sortcomm

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

関連情報