私の質問は、2 つの別々のファイル内の 2 つの行をどのように比較するかということです。基本的に 2 つのファイルがあり、file1 には次の行が含まれています。
${X##*a}
file2 には次の行が含まれています:
baaabaabab
私が試したことは次のとおりです:
diff -u file1 file2 > file3
しかし、それは期待どおりの結果にはなりませんaaaa
。また、両方のファイルは常に同じではありませんが、違いは常に行の先頭にあります。
プログラムを修正して、 と の 2 つの変数を持つようにしましたaaaabaaabaabab
。a
これで、次の操作を実行できます。
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