2 つの列に一致し、一致しない 2 つのファイルをリンクし、一致する各行で、ファイル 1 の 2 番目の列をファイル 2 の 6 番目の列に置き換えます。

2 つの列に一致し、一致しない 2 つのファイルをリンクし、一致する各行で、ファイル 1 の 2 番目の列をファイル 2 の 6 番目の列に置き換えます。

私はこれをやろうとしています。

2つのファイルがあります。
ファイル1良い:

102 13.342
103 7.456
105 6.453
107 3.567
108 4.210

ファイル2良い:

0 098 0 0 0 -9 x
0 099 0 0 0 -9 x
0 100 0 0 0 -9 x
0 101 0 0 0 -9 x
0 102 0 0 0 -9 x
0 103 0 0 0 -9 x
0 104 0 0 0 -9 x
0 105 0 0 0 -9 x
0 106 0 0 0 -9 x
0 106 0 0 0 -9 x
0 107 0 0 0 -9 x
0 108 0 0 0 -9 x

私が欲しいファイル3のように見える

 0 098 0 0 0 -9 x
 0 099 0 0 0 -9 x
 0 100 0 0 0 -9 x
 0 101 0 0 0 -9 x
 0 102 0 0 0 13.342 x
 0 103 0 0 0 7.456 x
 0 104 0 0 0 -9 x
 0 105 0 0 0 6.453 x

デフォルトでは、file1 と file2 の最初と 2 番目のフィールドをそれぞれ一致させ、一致しない項目を保持し、一致する各行で file1 の 2 番目のフィールド値を file2 の 2 番目のフィールド値に置き換えて、file1 と file2 を連結しようします。 6番目のフィールドの値。 ..

私はこの作業が以下の使用に関連していることを知っています join -a1 -a2 -o 1.2 whatsoever。しかし、進行方法がわからない...また奇妙だと考えられています。

ベストアンサー1

関連領域が多すぎると、次のように選択する傾向がありますawk

$ awk 'NR==FNR{a[$1]=$2; next}{if($2 in a){$6=a[$2]}}1;' file1 file2 
0 098 0 0 0 -9 x
0 099 0 0 0 -9 x
0 100 0 0 0 -9 x
0 101 0 0 0 -9 x
0 102 0 0 0 13.342 x
0 103 0 0 0 7.456 x
0 104 0 0 0 -9 x
0 105 0 0 0 6.453 x
0 106 0 0 0 -9 x
0 106 0 0 0 -9 x
0 107 0 0 0 3.567 x
0 108 0 0 0 4.210 x

説明する

  • NR==FNR{a[$1]=$2; next}NRは現在の行番号、FNR現在のファイルの現在の行番号です。複数のファイルを処理するときに最初のファイルを読み取る場合にのみ、2つのファイルが同じになります。次のファイル1をa[$1]=$2使用してください。st field as a key to an array whose value is the 2nd field. Theskips to the next line. So, this will save all values frominto the array

  • if($2 in a){$6=a[$2]}:今、私は2番目のファイルを読んでいます。行の2番目のフィールドが配列にある場合、a6番目のフィールド()は$62番目のフィールドに格納されている項目に設定されます。a

  • 1;:「この行を印刷してください」の略です。

おすすめ記事