我在Linux上工作。我有2个文件 - file1.dat和file2.dat。
cat file1.dat
1
2
3
4
5
6
7
8
9
10
和file2:
cat file2.dat
1a
2a
3a
4a
5a
6a
7a
8a
9a
10a
我想用file2.dat中的前4行替换file2.dat中的前4行。所以我的输出将是
cat file1.dat
1a
2a
3a
5
6
7
8
9
10
我尝试了以下输入:
sed -i.bak '1,4d;3r file2.dat' file1.dat
但是通过这个输入,我有以下输出:
5
6
7
8
9
10
我该如何修改输入命令?我尝试了各种组合。
答案 0 :(得分:3)
关注awk
也可以帮助您使用GNU awk
中相同且经过测试的代码。
解决方案1:
awk 'FNR==NR && FNR<4{print;next} FNR>4 && FNR!=NR' file2.dat file1.dat
解决方案第二:
awk 'FNR==NR && FNR==4{nextfile} FNR==NR{print;next} FNR>4 && FNR!=NR' file2.dat file1.dat
OR
awk 'FNR==NR{if(FNR==4){nextfile};print;next} FNR>4 && FNR!=NR' file2.dat file1.dat
解决方案3: 在此处使用awk
和head
以及tail
命令的组合。
awk 'FNR==1{system("head -n3 file2.dat");next} 1' <(tail -n +4 file1.dat)
答案 1 :(得分:2)
假设GNU sed
$ sed '3q' f2 | sed -e '3r /dev/stdin' -e '1,4d' f1
1a
2a
3a
5
6
7
8
9
10
sed '3q' f2
给出第二个文件的前三行-e '3r /dev/stdin'
使用stdin数据-e '1,4d'
删除所需的行r
然后d
对于少量行,您也可以使用
sed -e '3R f2' -e '3R f2' -e '3R f2' -e '1,4d' f1
R
命令一次读取一行
使用GNU coreutils,这可能对所有/大多数场景都更好
head -n3 f2; tail -n +5 f1
答案 2 :(得分:1)
awk
是你的朋友
<强>脚本强>
# awk 'NR==FNR && FNR<=3 || NR>FNR && FNR>4' file2 file1
<强>输出强>
1a
2a
3a
5
6
7
8
9
10
<强>提示强>
awk
只会打印。
所有好: - )