2つの共通フィールドに2つのファイルを結合します。

2つの共通フィールドに2つのファイルを結合します。

ファイルが2つあります。

file1.txt

78Z|033333157|0000001|PERD1|2150421|D|0507020|3333333311
78Z|033333157|0000001|PERD0|2160208|A|1900460|3333333311
78Z|033333157|0000001|RSAB1|2150421|D|0507070|3333333311
78Z|033333157|0000001|RSAB0|2160208|A|1900460|3333333311
78Z|033333157|0000001|ANT37|2141023|D|1245260|3333333311
78Z|033333157|0000001|ANT36|2150422|D|1518490|3333333311
78Z|033333157|0000001|ANT28|2150321|D|0502090|3333333311
78Z|033333157|0000001|ANT27|2150122|D|0501450|3333333311
78Z|033333157|0000001|ANT26|2141222|D|1637460|3333333311
78Z|033333157|0000001|ANT10|2160208|A|1900460|3333333311
78Z|033333157|0000001|ABS10|2151221|D|1223390|3333333311
78Z|696931836|0000001|PERD0|2160203|A|1114450|2222222222
78Z|696931836|0000001|RSAB0|2160203|A|1114450|2222222222
78Z|696931836|0000001|ANT09|2160203|A|1114450|2222222222
78Z|010041586|0000001|PERD0|2160119|A|1835100|3333333333
78Z|010041586|0000001|RSAB0|2160119|A|1835100|3333333333
78Z|010041586|0000001|ANT33|2160119|A|1835100|3333333333
78Z|011512345|0000001|PERD0|2151213|A|1413550|4444444444
78Z|011512345|0000001|RSAB0|2151213|A|1413550|4444444444
78Z|011512345|0000001|ANT32|2160219|A|0319230|4444444444
78Z|011512345|0000001|ANT09|2160218|D|0319230|4444444444
78Z|011512345|0000001|ANT07|2150729|D|1508230|4444444444
78Z|011512345|0000001|ANT06|2141013|D|1208190|4444444444
78Z|011512345|0000001|ABB06|2131224|D|1857030|4444444444
78Z|012344052|0000001|PERD0|2160203|A|1219570|5555555555
78Z|012344052|0000001|ANT50|2160203|A|1219570|5555555555
78Z|099999999|0000001|PERD0|2151214|A|1512460|6666666666
78Z|099999999|0000001|RSAB0|2151214|A|1512460|6666666666
78Z|099999999|0000001|ANT32|2160219|A|0319000|6666666666
78Z|099999999|0000001|ANT09|2160218|D|0319000|6666666666
78Z|099999999|0000001|ABS10|2150615|D|0125350|6666666666

file2.txt

3333333311|ANT10
2222222222|ANT09
5555555555|ANT50
3333333333|ANT33
6666666666|ANT32
4444444444|ANT09

4番目と8番目の列、2番目と1番目の列にfile1.txt一致する行を含む新しいファイルを作成する必要があります。file2.txt

結果は次のようになります(順序は重要ではありません)。

file3.txt

78Z|033333157|0000001|ANT10|2160208|A|1900460|3333333311
78Z|696931836|0000001|ANT09|2160203|A|1114450|2222222222
78Z|012344052|0000001|ANT50|2160203|A|1219570|5555555555
78Z|010041586|0000001|ANT33|2160119|A|1835100|3333333333
78Z|099999999|0000001|ANT32|2160219|A|0319000|6666666666
78Z|011512345|0000001|ANT09|2160218|D|0319230|4444444444

答え1

awk -F'|' 'NR==FNR{e[$2$1]=1;next};e[$4$8]' file2.txt file1.txt

最初の読書ファイル2e[field2+field1]次に配列を設定します。ファイル1e[field4+field8]設定されているかどうかを印刷します。

またはフィールドを反転します。

awk -F'|' 'NR==FNR{e[$1$2]=1;next};e[$8$4]' file2.txt file1.txt

答え2

質問にタグが付けられました。しかし、私の考えはあなたがそうではないことに注意する価値があると思います。持つこんなことをしたりしたawk。 coreutilsにはこの種の操作に便利なユーティリティがありますが、joinデータには少し面倒です。

あなたのシェルがbashとGNUのcoreutilsであると仮定します。これはさまざまなスタイルで実行できますが、データの事前/後処理がより必要になる可能性があります。

もう面倒はありません。

join -t"|" -14 -22 -o"$(echo 1.{1..8} 2.1)" \
  <(sort -t"|" -k4 file1.txt) \
  <(sort -t"|" -k2 file2.txt) \
  | grep -Po ".*([\d]+)(?=\|\1$)"

join-12つの入力ファイルを受け入れ、引数を介して渡されたフィールドにそれを連結します-2-t入力ファイルのユーザー定義フィールド区切り文字を表します。 join入力ファイルは関連するフィールドでソートする必要があるため、両方の入力ファイルに渡される前にプロセスオーバーライドでソートされますjoin。この-oパラメーターは、フィールドの出力方法を指定します。デフォルトではリンクされたフィールドで、その後にファイル 1 の未接続フィールド、最後にファイル 2 のリンクされていないフィールドがあります。したがって、ファイル1のすべてのフィールドを順番に指定し、その後にフィールド1が続くように指定する必要があります。ファイル2の

また、結合はfile1のフィールド8とfile1のフィールド1になければなりません。これは、結合出力フィールド 8 と 9 が等しい場合、行を検索することによって簡単に行われます。正規表現プレビューを使用すると、grep -Poこれを実行してフィールド9を効果的に削除して、目的の出力を提供できます。出力は次のとおりです

78Z|696931836|0000001|ANT09|2160203|A|1114450|2222222222
78Z|011512345|0000001|ANT09|2160218|D|0319230|4444444444
78Z|033333157|0000001|ANT10|2160208|A|1900460|3333333311
78Z|099999999|0000001|ANT32|2160219|A|0319000|6666666666
78Z|010041586|0000001|ANT33|2160119|A|1835100|3333333333
78Z|012344052|0000001|ANT50|2160203|A|1219570|5555555555

答え3

単純に、同じ最初のフィールドがfile2に2回提供されることは許可されていないとします。

awk -F'|' 'FNR == NR { key[$1] = $2; next } $8 in key && key[$8] == $4' file2.txt file1.txt

答え4

努力する

awk 'BEGIN { FS="|"}
     FNR == NR { key[$2 $1]=NR }
     FNR > NR { k=$3 $8 ;if (k in key)  print ;} ' file2.txt file1.txt

どこ

  • BEGIN { FS="|"}区切り文字として使用するようにawに指示します(コマンドラインで使用可能|)。-F\|
  • FNR == NR { key[$2 $1]=NR }ファイルのキーを記憶する(file2.txtにある場合)
  • FNR > NR { k=$4 $8 ;if (k in key) print ;}キーがハッシュリストにある場合は印刷してください。

編集:3番目のフィールドに言及し、4番目のフィールドを追加しました。

関連情報