如何根据文件B中的行号替换文件A中的某些行
How to replace some of the lines of file A according to line numbers in file B
我有两个文件 File A 和 File 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
有办法吗?通常,在提问时我还会放一段代码来展示我的努力,但这次我什至无法开始写代码来做到这一点。
awk 'FNR==NR{arr[]=substr([=10=],index([=10=],));next}
FNR in arr{print arr[FNR];next}1
' fileB fileA
或
awk 'FNR==NR{arr[]=substr([=11=],length()+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[]=substr([=12=],index([=12=],));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[]=substr([=12=],length()+2);next}FNR in arr{print arr[FNR];next}1' fileB fileA
poo foo
change-second-line with-this
change-third-line with-that
我有两个文件 File A 和 File 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
有办法吗?通常,在提问时我还会放一段代码来展示我的努力,但这次我什至无法开始写代码来做到这一点。
awk 'FNR==NR{arr[]=substr([=10=],index([=10=],));next}
FNR in arr{print arr[FNR];next}1
' fileB fileA
或
awk 'FNR==NR{arr[]=substr([=11=],length()+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[]=substr([=12=],index([=12=],));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[]=substr([=12=],length()+2);next}FNR in arr{print arr[FNR];next}1' fileB fileA
poo foo
change-second-line with-this
change-third-line with-that