ファイルが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
-1
2つの入力ファイルを受け入れ、引数を介して渡されたフィールドにそれを連結します-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番目のフィールドを追加しました。