file2 の列 2 が file1 の列 2 と異なる場合は、file1 の列 1 と 2 つのファイルの列 2 を印刷します。

file2 の列 2 が file1 の列 2 と異なる場合は、file1 の列 1 と 2 つのファイルの列 2 を印刷します。

それぞれ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つの元の答えです。回答は、現在書かれている質問に似た単純な場合に非常に便利です。

  1. ファイルを並べ替えて一致させる場合は、まずコマンドラインユーティリティを使用して、各行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}'

  2. ソートされていない一致ファイルの場合は、すべてsortfile1 と fil2 の内容は同じです。ただし、次を使用してpasteシェルでこれを実行できます。bashプロセスの交換<( command )は次の例のようにフォーマットを取ります。

    貼り付け -d"," <(ファイル 1 のソート) <(ファイル 2 のソート) awk 'BEGIN{FS=",";OFS=","}$2 != $4{printf "%s,%s,%s "、$ 1、$ 2、$ 4}"

  3. ソートされていない一致しないファイルセット(現在作成されている質問)については、ユーザーdon_crisstiの回答を参照してください。

答え3

結合を使用できますか?

sort -o file1 file1 
sort -o file2 file2 
join -t"," -1 1 -2 1 file1 file2 | awk '$2!=$3'

関連情報