2つのファイルをマージして1つのコピーを保持します。

2つのファイルをマージして1つのコピーを保持します。

2つの入力ファイルの列を含むファイルを作成したいと思います。

ファイル1は次のようになります。

11111111        abc12345   Y
22222222        xyz23456   Y

ファイル2:

11111111       abc12345    
33333333       kbc34567

出力は次のようになります。

11111111        abc12345   Y
22222222        xyz23456   Y
33333333        kbc34567

次のことを試して重複項目を見つけることができましたが、最初のファイルと他のレコードの重複項目も同じ形式(最初、2番目、および3番目の列の間の同じスペース)でなければなりません。

awk 'FNR==NR{a[$1$2]=$1$2;next} ($1$2 in a) {print a[$1$2],$3}' file2 file1

ベストアンサー1

i) 連結された最初と2番目のフィールド; ii) 3番目のフィールドを印刷しているため、スペースが変更されます。デフォルトでは、awkスペースは出力フィールド区切り文字()として使用されるため、スペースはOFS混乱します。簡単な解決策は、$0行自体()をフィールドの代わりに配列に格納することです。

a[$1$2]=$0;

ただし、とにかくスクリプトは必要に応じて機能しません。 file2のfile1の行のみを印刷するため、file1にのみある行はすべてスキップされます。目的の出力に基づいて両方のファイルのすべての行を印刷し、file2の1行にfile1の最初の2つのフィールドと同じ最初の2つのフィールドがある場合は、file1の対応する行のみを印刷しようとしています。次の方法でこれを実行できますawk

awk 'FNR==NR{a[$1$2]=$0; print} !($1$2 in a) {print}' file1 file2 

file1これにより、配列の各行が保存され印刷されます。その後、file2処理時に最初の2つのフィールドがないすべての行を印刷しますa


以下を使用してこれを実行することもできますsort

$ sort -uk1,2 file1 file2 
11111111    abc12345    Y
22222222    xyz23456    Y
33333333    kbc34567

両方のファイルでスペースの量が等しいかどうかを確認する(例ではそうではありません)、これを達成するには、次のコマンドを使用します。

$ sed  's/  */\t/g' file1 file2 | sort -uk1,2 
11111111    abc12345    Y
22222222    xyz23456    Y
33333333    kbc34567

おすすめ記事