假设我有一个名为的文件,before.txt
内容如下:
1
2
3
4
但想要4
用名为 .txt 的文本文件中的数字(按顺序)替换该数字after.txt
。我该怎么做呢?
after.txt
包含:
2743
3028
2850
1092
etc.
这也能变成剧本吗?如果是这样,我希望它按顺序循环遍历所有字符串,并如上所述after.txt
替换字符串。4
答案1
awk '/^4$/&&getline<"after.txt"||1' before.txt
如果当前记录$0
正是文本4
,则从 获取下一行after.txt
。如果成功,它将变为$0
并getline
返回 1,因此表达式为 true 并且{print}
触发默认操作。
如果记录不是4
,或者 getline0
在EOF
of处返回after.txt
,则||1
确保我们仍然打印当前记录。$0
如果读取失败则不修改after.txt
。
如果getline
a 失败-1
,我们仍然打印$0
,因为这是一个非零返回码。
答案2
给定这些文件:
cat before.txt
1
2
3
4
1
1
2
3
4
2
3
4
cat after.txt
2743
3028
2850
1092
还有这个小脚本:
#!/bin/bash
while read -r line; do
if [[ "$line" == 4 ]]; then
sed -n '1p' after.txt
sed -i".bup" '1d' after.txt
else
echo "$line"
fi
done < before.txt
我得到这个结果:
./script.sh
1
2
3
2743
1
1
2
3
3028
2
3
2850
我确信有一个awk
oneliner 可以做到这一点,但我说话不awk
流利!另外,如果您想替换(“就地”)文件before.txt
,则必须更改sed
循环中的语句。否则,您可以简单地重定向STDOUT
到一个新文件。在本例中,我选择将所有内容打印出来STDOUT
以便于查看。
测试下操作系统 X 10.11.6和BSDsed
答案3
awk 中有类似的东西吗?
$ awk 'NR==FNR{Arr[NR]=$0;next}{if($0==4){i++;print Arr[i]}else{print}}' after.txt before.txt
1
2
3
2743
1
1
2
3
3028
2
3
2850