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