如何根据文件B中的行号替换文件A的某些行

时间:2017-10-02 19:29:00

标签: linux file awk sed text-processing

我有两个档案文件A和档案B.

文件A中的行包含两个用制表符或单个字段分隔的字段。在文件B中,每行包含3个字段(再次与选项卡分隔)第一个字段是整数,第二个和第三个字段是一些字符串。现在,如果在文件B(第一个字段)中看到其行号,我想更改文件A中的一行。通过更改,我的意思是我想通过选项卡合并文件B中该行的第二个和第三个字段,并将相应的行放在文件A中

例如,假设我有一个包含3行的文件A

File A:
poo    foo
koo    goo
too    roo  

我有一个包含2行的文件。

File B:
2 change-second-line with-this
3 change-third-line  with-that

最后,我想要一个包含以下内容的文件:

File final:
poo    foo
change-second-line    with-this
change-third-line    with-that  

有办法吗?一般来说,在提问时我还会放一个显示我努力的代码片段,但这次我甚至无法开始写这个。

1 个答案:

答案 0 :(得分:0)

awk 'FNR==NR{arr[$1]=substr($0,index($0,$2));next}
     FNR in arr{print arr[FNR];next}1
    ' fileB fileA

OR

awk 'FNR==NR{arr[$1]=substr($0,length($1)+2);next}
     FNR in arr{print arr[FNR];next}1
    ' fileB fileA

测试结果:

$ cat fileA
poo    foo
koo    goo
too    roo  

$ cat fileB
2 change-second-line with-this
3 change-third-line  with-that

$ awk 'FNR==NR{arr[$1]=substr($0,index($0,$2));next}FNR in arr{print arr[FNR];next}1' fileB fileA
poo    foo
change-second-line with-this
change-third-line  with-that

# OR will be faster too
$ awk 'FNR==NR{arr[$1]=substr($0,length($1)+2);next}FNR in arr{print arr[FNR];next}1' fileB fileA
poo    foo
change-second-line with-this
change-third-line  with-that