![入れ子になった[While、IF、Sed]ステートメントの他のファイルの行と一致する場合は、行を置き換えます。](https://linux33.com/image/156144/%E5%85%A5%E3%82%8C%E5%AD%90%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%5BWhile%E3%80%81IF%E3%80%81Sed%5D%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E4%BB%96%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%A1%8C%E3%81%A8%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%E8%A1%8C%E3%82%92%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%BE%E3%81%99%E3%80%82.png)
F1
次の形式で、1行に8つのフィールドを持つ17k行の長さのファイルがあります。
id1 field2 field3 field4 field5 field6 field7 field8
id2 field2 field3 field4 field5 field6 field7 field8
2番目のファイルのF2
内容は、行(列)ごとに単一のフィールドに展開されます。
id1
uuuuuuu
bbbbbbb
aaaaaaa
id2
ttttttt
qqqqqqq
...
一致するものがある場合は、from行をF2
from行に置き換える必要があります。以下の奇妙なwhileループが機能すると思いましたが、言うまでもなく毎回変更されF1
たすべての行を返します。F2
それとも、Bashにこれを行うための別の魔法のツールがありますか?
while read id1 id2 id3 id4 id5; do
while read ID; do
if [[ $ID == "$id1" ]]; then
sed "s/$ID/$id1 $id2 $id5 $id4/" F2 && break
fi
done < F2
done < F1
答え1
これは仕事です。アッ
awk 'NR == FNR {line[$1] = $0; next} $1 in line {$0 = line[$1]} 1' F1 F2
NR == FNR {line[$1] = $0; next}
- 読み込み時にF1
最初のフィールドに入力された各行を保存します。$1 in line {$0 = line[$1]}
-F2
今読んでいます。最初のフィールドが配列にある場合は、line
配列の値を現在のレコードに置き換えます。1
- 現在のレコードを印刷します。