2017-11-27 8 views
1

ファイルへのパスを含む2つのファイルがあります。linux bash - 2つのファイルを比較し、同じ終端を持つ重複する行を削除する

ファイル1

/home/anybody/proj1/hello.h 
/home/anybody/proj1/engine.h 
/home/anybody/proj1/car.h 
/home/anybody/proj1/tree.h 
/home/anybody/proj1/sun.h 

2つのファイルと出力に、2つのファイルの組み合わせを比較するファイル2

/home/anybody/proj2/module/include/cat.h 
/home/anybody/proj2/module/include/engine.h 
/home/anybody/proj2/module/include/tree.h 
/home/anybody/proj2/module/include/map.h 
/home/anybody/proj2/module/include/sun.h 

私はおそらくのgrepを使用して、コマンドを必要とする、しかし、の場合、ファイル名と重複する場合は、ファイル2からファイルを保存してください。

期待される出力:

/home/anybody/proj1/hello.h 
/home/anybody/proj1/car.h 
/home/anybody/proj2/module/include/cat.h 
/home/anybody/proj2/module/include/engine.h 
/home/anybody/proj2/module/include/tree.h 
/home/anybody/proj2/module/include/map.h 
/home/anybody/proj2/module/include/sun.h 

これは私のプロジェクトのタグデータベースのインクルードファイルのリストを生成することができますが、ビルドによっていくつかのファイルが複製され、同じファイルの2つのコピーをデータベースに保存したくありません。

答えて

2

このawkコマンドは、ジョブを実行する必要があります実行する必要があります。

awk -F/ 'NR == FNR{a[$NF]=$0; next} !($NF in a); END{for (i in a) print a[i]}' file2 file1 

/home/anybody/proj1/hello.h 
/home/anybody/proj1/car.h 
/home/anybody/proj2/module/include/map.h 
/home/anybody/proj2/module/include/cat.h 
/home/anybody/proj2/module/include/engine.h 
/home/anybody/proj2/module/include/tree.h 
/home/anybody/proj2/module/include/sun.h 
+0

これは改行を含むでしょう! – SriniV

+0

あなたはそれが何を意味するかを明確にすることはできますか?これは、提供されるサンプルデータと同じです。 – anubhava

+1

それはうまく動作します、ありがとうございます – Percee

1

これは

cat file2 file1 | awk -F '/' ' 
{ if (a[$NF] == "") a[$NF] = $0 } 
END { for (k in a) print a[k] }' | sort 
+0

データは、私は私のスクリプトを拡張 – SriniV

+0

にソートされません。しかし、通常、データベースはソートされていないデータを扱うことができます – Ronald

+1

ありがとう、それは – Percee

関連する問題