入れ子になった[While、IF、Sed]ステートメントの他のファイルの行と一致する場合は、行を置き換えます。

入れ子になった[While、IF、Sed]ステートメントの他のファイルの行と一致する場合は、行を置き換えます。

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行をF2from行に置き換える必要があります。以下の奇妙な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 
  1. NR == FNR {line[$1] = $0; next}- 読み込み時にF1最初のフィールドに入力された各行を保存します。
  2. $1 in line {$0 = line[$1]}-F2今読んでいます。最初のフィールドが配列にある場合は、line配列の値を現在のレコードに置き換えます。
  3. 1- 現在のレコードを印刷します。

おすすめ記事