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ループを使用する代わりに-f
forフラグを使用することもできます。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'