diff出力を使用して別のファイルと比較してみてください。

diff出力を使用して別のファイルと比較してみてください。

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

smw:/working/iso_testing # cat a
QConvergeConsoleCLI-1.1.03-49.x86_64.rpm
aaa_base-13.2+git20140911.61c1681-1.3.i586.rpm
acpica-20140724-2.1.2.i586.rpm
test.rpm

そして

smw:/working/iso_testing # cat b
QConvergeConsoleCLI-1.1.03-49.x86_64.rpm
aaa_base-13.2+git20140911.61c1681-1.3.i586.rpm
acpica-20140724-2.1.2.i586.rpm

--比較すると次のようになります。

smw:/working/iso_testing # diff a b
4d3
< test.rpm

その出力(test.rpm)をインポートして3番目のファイルからインポートしたいと思います。別名ファイルc:

smw:/working/iso_testing # cat c
QConvergeConsoleCLI QConvergeConsoleCLI-1.1.03-49.x86_64.rpm
aaa_base aaa_base-13.2+git20140911.61c1681-1.3.i586.rpm
acpica acpica-20140724-2.1.2.i586.rpm
test test.rpm

私が望む出力は次のとおりです。

test test.rpm

たぶん起動しなければならないファイルがたくさんありますが、詰まっている可能性があります。事前にありがとう

ファイルAはリポジトリのrpmリスト、ファイルBは.csvファイルのrpmリスト、ファイルCはファイルBのコピーですがrpmだけではないパッケージ名を含みます。 ***

答え1

TLDRソリューションは次のとおりです。

for line in "$(diff a b | sed -n 's/^< //p')"; do grep "${line}" c; done

以下は、より詳細な説明です。


最初にすることは、コマンドの出力を整理し、検索したいdiff文字列を抽出することです。

あなたの例によれば、最初のファイル(ファイル「a」など)にのみ表示される行が欲しいようです。

次のコマンドは、最初のファイルの行を返し、「<」プレフィックスを削除します。

diff <(diff a b | sed -n 's/^< //p')

これで、各行に対してクリーンアップされたdiffとgrepを繰り返すことができます。たとえば、次のようになります。

for line in "$(diff a b | sed -n 's/^< //p')"; do grep "${line}" c; done

このアプローチの利点は、grepステートメントを任意のコマンドに置き換えることができるため、非常に柔軟性があることです。

一方、固定文字列のみを検索する場合は、forループを使用する代わりに-fforフラグを使用することもできます。grep

grep -f <(diff a b | sed -n 's/^< //p') c

diffもう一つのオプションは、2番目に電話することです。

diff <(diff a b | sed -n 's/^< //p') c

その後、同様の方法でこの出力を処理できます。

diff <(diff a b | sed -n 's/^< //p') c | sed -n 's/^< //p'

関連情報