ファイル1:Excelファイル(.xls)
UN ID St M1 M2 SE DOF PV PA FC
17127159 0 -5.9 297.3 765.7 0.22 4 0.003 0.00389231 2.57536
17127163 2 -3.87 189.914 492.307 0.3548 4 0.0179 0.01795 2.59226
17127167 4 -3.8908 339.136 855.276 0.3429 4 0.0176 0.017 2.52192
17127171 6 -3.922 390.44 986.365 0.340 4 0.0172179 0.01721 2.52627
17127175 8 -4.715 536.072 1210.65 0.2492 4 0.00920158 0.00920 2.258
ファイル2:テキストファイル(.txt)
UNIT_ID UN TID X E GG7 J O
0 17127159 16657436 353.568 335.295 221.717 815.654 684.85
1 17127161 16657436 11.0842 7.01459 7.33511 11.2121 12.6268
2 17127163 16657450 221.647 226.774 136.274 431.32 392.533
3 17127165 16657452 5.02182 3.41172 4.12834 6.90306 4.91183
最初のファイルの最初の列が2番目のファイルの2番目の列と一致する場合は、2番目のファイルの3列から9列の一致する行を抽出して最初のファイルに保存します。
誰が私を助けることができますか?
出力は新しいファイルに保存する必要があります。
出力:
UN ID St M1 M2 SE DOF PV PA FC TID X E GG7 J O
17127159 0 -5.9 297.3 765.7 0.22 4 0.003 0.00389231 2.57536 16657436 353.568 335.295 221.717 815.654 684.85
ベストアンサー1
解決策awk
:
$ awk 'NR==FNR{a[$2]=$3"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8"\t"$9; next}
{
if($1 in a){
print $0,a[$1]
}
}' file2 file1
UN ID St M1 M2 SE DOF PV PA FC TID X E GG7 J O
17127159 0 -5.9 297.3 765.7 0.22 4 0.003 0.00389231 2.57536 16657436 353.568 335.295 221.717 815.654 684.85
17127163 2 -3.87 189.914 492.307 0.3548 4 0.0179 0.01795 2.59226 16657450 221.647 226.774 136.274 431.32 392.533
説明する
awkは、各入力行をフィールド(デフォルトでは空)に分割して最初のフィールドを2番目のフィールド$1
にする$2
式に進みます。特殊変数NR
は現在の入力行番号であり、これはFNR
読み取っているファイルの現在の行番号でもあります。したがって、複数のファイルを処理する場合、最初のファイルを読み取るときにのみ2つのファイルが同じです。
NR==FNR{a[$2]=$3"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8"\t"$9; next}
:最初のファイルを読み取る場合は、フィールド3〜9(タブ付き)をa
キーが2番目のフィールドである配列の値として保存します。その後、そのnext
行にジャンプします。これにより、
next
スクリプトの残りの部分がfile2
最初のファイル()に対しては実行されず、2番目のファイル(file1
)に対してのみ実行されます。if($1 in a){ print $0,a[$1] }
:これは2番目のファイル()にありますfile1
。最初のフィールドa
が配列()のキーとして存在する場合は、現在の行とif($1 in a)
フィールド3〜9に$0
格納されている値を印刷します。a
$1
file2