2 つの別々のファイル内の 2 行を比較するにはどうすればよいでしょうか?

2 つの別々のファイル内の 2 行を比較するにはどうすればよいでしょうか?

私の質問は、2 つの別々のファイル内の 2 つの行をどのように比較するかということです。基本的に 2 つのファイルがあり、file1 には次の行が含まれています。

${X##*a}

file2 には次の行が含まれています:

baaabaabab

私が試したことは次のとおりです:

diff -u file1 file2 > file3

しかし、それは期待どおりの結果にはなりませんaaaa。また、両方のファイルは常に同じではありませんが、違いは常に行の先頭にあります。


プログラムを修正して、 と の 2 つの変数を持つようにしましたaaaabaaabaababaこれで、次の操作を実行できます。

echo ${var1##*$var2} > tempfile.txt

tempfile には が含まれていますbaaabaabab。しかし、 を取得するにはどうすればよいでしょうかaaaa? 次のように考えていました:

echo ${var1//*$var2} > tempfile.txt

しかしそれは機能しません。

答え1

diffは行ごとに動作します。したがって、行が 1 文字だけ異なる場合でも、diff はそれらの行が異なるとみなします。

この場合にできることの 1 つは、各文字が独自の行になるように入力データを変換することです。 コマンドはfoldこれに役立ちます。 つまり、次のようなことができます。

$ diff <(fold -w1 file1) <(fold -w1 file2)
1,4d0
< a
< a
< a
< a
$ 

これは、入力ファイルに実際に 1 行しかない場合にのみ機能します。

この出力形式があなたにとって有用かどうかは分かりません。もしあなたが文字通り「aaaa」という文字列を求めており、その差が確実にのみ入力行の 1 か所に上記の出力をパイプすることができますawk

$ diff <(fold -w1 file1) <(fold -w1 file2) | awk '/^< / { printf $2 }'
aaaa$ 
$

答え2

Perl を使用して、最初のファイルの内容から 2 番目のファイルの内容を削除し、最初のファイルの残りを出力ファイルに印刷する方法を次に示します。

perl -e '$x=<>; $y=<>; $x=~s/$y//; print $x' 1.txt 2.txt > out.txt

関連情報