同様の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
どのように動作しますか?
FNR==NR{a[$1]=OFS $2;next}
file2
コマンドラインの最初のファイルを読み取るときは、最初のフィールドのキーa
の下の関連配列にエントリを追加します$1
。項目は出力フィールド区切り文字OFS
と2番目のフィールドで構成されています$2
。その後、残りのコマンドをスキップして再起動しますnext
。印刷
$0 a[$1]
file1
コマンドラインの2番目のファイルを読みながら各行を印刷し、その行の配列a
値を印刷します。