それぞれ2つの列を持つ2つのソートされていないファイルがあります。列1の値はfile2のすべての行の値と一致しますが、列2の値が異なるfile1のすべての行に対して列1の値とすべての列2の値を印刷したいと思います。
ファイル1の列1のデータがファイル2にない場合は削除できます。出力ファイルでソート順を維持する必要はありません。
file1:
2222,b2
4444,d4
1111,a1
3333,c3
5555,e5
file2:
2222,8f
5555,e9
4444,7c
3333,c3
OUTPUT file:
2222,b2,8f
4444,d4,7c
5555,e5,e9
答え1
2番目のファイルを読み取り、内容を配列(キー=最初のフィールド、値=2番目のフィールド)に保存し、最初のファイルを読み取り、最初のフィールドが共通キーであるかどうか、およびそれらの2つのフィールドが異なるかどうかを確認します。結果が正の場合、キーと両方の値を印刷します。
awk 'BEGIN{FS=OFS=","}NR==FNR{z[$1]=$2;next}
{if (z[$1] && (z[$1]!=$2)){print $0, z[$1]}}' file2 file1
答え2
編集:最初に書かれた質問はやや不明で重要な詳細が欠けていました。以下は、質問が明確になり、私が書いた2つの元の答えです。回答は、現在書かれている質問に似た単純な場合に非常に便利です。
ファイルを並べ替えて一致させる場合は、まずコマンドラインユーティリティを使用して、各行
paste
にファイル2の2番目の列を追加する一時的な3番目のファイルを作成することをお勧めします。このコマンドpaste
の出力をパイプすることでawk
解決awk
策が簡単になります$2 != $4{printf "%s %s %s", $1, $2, $4}
。貼り付け -d"," file1 file2 | awk 'BEGIN{FS=",";OFS=","}$2 != $4{printf "%s,%s,%s", $1, $2, $4}'
ソートされていない一致ファイルの場合は、すべて鍵
sort
file1 と fil2 の内容は同じです。ただし、次を使用してpaste
シェルでこれを実行できます。bash
プロセスの交換<( command )
は次の例のようにフォーマットを取ります。貼り付け -d"," <(ファイル 1 のソート) <(ファイル 2 のソート) awk 'BEGIN{FS=",";OFS=","}$2 != $4{printf "%s,%s,%s "、$ 1、$ 2、$ 4}"
ソートされていない一致しないファイルセット(現在作成されている質問)については、ユーザーdon_crisstiの回答を参照してください。
答え3
結合を使用できますか?
sort -o file1 file1
sort -o file2 file2
join -t"," -1 1 -2 1 file1 file2 | awk '$2!=$3'