用其他文件中的前几行替换前几行

时间:2018-01-22 13:01:31

标签: linux sed

我在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

我该如何修改输入命令?我尝试了各种组合。

3 个答案:

答案 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: 在此处使用awkhead以及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

<强>提示

  • NR - 处理的记录总数
  • FNR - 已处理的记录总数,但在读取新文件时会重置。
  • 当条件评估为true且没有给出额外命令时,awk只会打印。

所有好: - )