我有一个 17k 行长的文件F1
,每行 8 个字段,格式如下:
id1 field2 field3 field4 field5 field6 field7 field8
id2 field2 field3 field4 field5 field6 field7 field8
第二个文件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
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
-- 打印当前记录。