File1のパターンをFile2の対応する一致パターン+列に置き換えます。

File1のパターンをFile2の対応する一致パターン+列に置き換えます。

同様のQ&Aをたくさん見ましたが、まだ解決策はありません。

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

ファイル1

cow
aaaaa
brown
bbbbb
often
ccccc
farts
ddddd

ファイル2

File2では、"space"を区切り文字として使用し、次にcol 1 = "brown"とcol2 = "149,456,foo"を使用します。また、File1とFile2の順序が異なります(ここではソートは機能しません。交換のために一致するキーに依存したい)。

brown 149,456,foo
cow 192,231,bar
farts 81,2007,tip
often 427,541,top

ファイル3を作成したいです。

cow 192,231,bar
aaaaa
brown 149,456,foo
bbbbb
often 427,541,top
ccccc
farts 81,2007,tip
ddddd

つまり、File2のcolumn1(茶色)を記録し、File1から検索します。 File1で一致が見つかったら、一致をそのFile2の行全体(茶色149,456、foo)に置き換えます。

私はこれを試しました:

$ awk 'NR==FNR{a[NR]=$0;next}{$6=a[FNR]}1' file2 file1

ただし、結果は各row1をインポートし、他のファイルのrow1と一緒に印刷するように見え、一致/交換は必要ありません。

brown     brown 149,456,foo
aaaa     cow 192,231,bar
cow     farts 81,2007,tip
bbbbb     often 427,541,top
farts     
ccccc     
often     
ddddd 

awkやsedを使いたいです。どんなアドバイスもよろしくお願いします!

ベストアンサー1

努力する:

$ awk 'FNR==NR{a[$1]=OFS $2;next} {print $0 a[$1]}' file2 file1
cow 192,231,bar
aaaaa
brown 149,456,foo
bbbbb
often 427,541,top
ccccc
farts 81,2007,tip
ddddd

どのように動作しますか?

  1. FNR==NR{a[$1]=OFS $2;next}

    file2コマンドラインの最初のファイルを読み取るときは、最初のフィールドのキーaの下の関連配列にエントリを追加します$1。項目は出力フィールド区切り文字OFSと2番目のフィールドで構成されています$2。その後、残りのコマンドをスキップして再起動しますnext

  2. 印刷$0 a[$1]

    file1コマンドラインの2番目のファイルを読みながら各行を印刷し、その行の配列a値を印刷します。

おすすめ記事