awk - 单个 f==2 文件编号,使用另一个文件的第二行和第三行替换同一文件中的两个字符串

awk - A single f==2 file number to replace two strings in the same file using second and third line of another file

我正在 AWK User's Guide 阅读有关 sub() 的内容。

我想替换dog.txtcatsun中的两个字符串,分别使用anti-dog-sun.txt文件第二行和第三行的内容.

dog.txt:

school
dog
sun

反狗-sun.txt:

house
cat
moon

首先我想提交如何使用anti-dog-sun.txt的第二行替换dog.txt的字符串dog,即用[=替换dog dog.txt 上的 21=] 并将输出保存到 2.txt,如下所示:

code_0:

awk \
'FNR==1 {++f}
f==1 {a[i++]=[=12=]}
f==2 {if (sub(/dog/,a[int((h++)%(0.5*2)/1)+1])) ; print > "1.txt"}' \
anti-dog-sun.txt dog.txt

输出1.txt:

school
cat
sun

现在可以使用anti-dog-sun.txt的第三行来替换dog.txt的字符串sun,即将sun替换为moon,并将输出保存到 2.txt,我使用了以下内容:

code_01:

  awk \
  'FNR==1 {++f}
  f==1 {a[i++]=[=14=]}
  f==2 {if (sub(/sun/,a[int((h++)%(0.5*2)/1)+2 ])) ; print > "2.txt"}' \
  anti-dog-sun.txt dog.txt

输出2.txt:

school
dog
moon

但我不想将这些两个替换并分别保存在1.txt2.txt

我想在单个进程 f==2 {if(sub(); print > "single.txt"}中进行两次替换,即保存只有 single.txt 中的 ,其中最后的 single.txt 会像这样:

school
cat
moon

我试图以某种方式..sub(/dog//sun/,a[int((h++)%(0.5*2)/1)+1],a[int((j++)%(0.5*2)/1)+2])..加入code_0code_01 code_02以下:

awk \
'FNR==1 {++f}
f==1 {a[i++]=[=17=]}
f==2 {if (sub(/dog/,/sun/,a[int((h++)%(0.5*2)/1)+1],a[int((j++)%(0.5*2)/1)+2])) ; print > "single.txt"}' \
anti-dog-sun.txt dog.txt

但是得到跟随错误:

awk: cmd. line:3: f==2 {if (sub(/dog/,/sun/,a[int((h++)%(0.5*2)/1)+1],a[int((j++)%(0.5*2)/1)+2])) ; print > "single.txt"}
awk: cmd. line:3:                                                                              ^ 4 is invalid as number of arguments for sub

注意: 在发布这个问题之前,我阅读了指南 AWK 用户指南 几次,我也试图在这里寻求一些答案OS 或不在其中,我不确定是否可以仅使用 sub().

来进行这两个替换

编辑更新: 如果你真的不能使用 sub() 执行 2 次替换,一旦时间有没有办法做到这一点 而无需写更多比 single.txt 文件中的一次 ?便携的解决方案? 满足我编辑的答案UPDATE 02.

EDIT UPDATE 01: 我不想简单地分别使用 anti-dog-sun.txt 的第二行和第三行替换 dog.txt 的第二行和第三行(这只是为了显示 MWE),如果解决方案应该查找字符串 dogsun.

EDIT UPDATE 02: 另一个条件是机制 a[int((k++)%(x3*2)/x2)+x1] 应该被维护,因为这个 MWE 是从这里对这个问题的答案的实际使用中产生的 .

EDIT UPDATE 03: 编辑我的问题时出现打字错误,我已经将 dog.txt anti-dog-sun.txt 更正为 anti-dog-sun.txt dog.txt。对不起。

假设您想根据内容进行替换,请您试试:

awk 'NR==FNR {a[FNR]=[=10=]; next}          # store the lines of anti-dog-sun.txt in the array "a"
    /dog|sun/ {[=10=]=a[FNR]} 1             # replace the lines of dog.txt if the keyword matches
' anti-dog-sun.txt dog.txt

你可以使用头部和尾部:

head -n1 dog.txt; tail -n2 anti-dog.txt
school
cat
moon

或者用 awk:

awk '(FNR==NR && NR==1) || (NR>FNR && FNR>1)' dog.txt anti-dog.txt
# same

已解决:

awk \
'FNR==1 {++f}
f==1 {a[i++]=[=10=]}
f==2 {sub(/dog/,a[int((h++)%(0.5*2)/1)+1]); sub(/sun/,a[int((j++)%(0.5*2)/1)+2]) ; print > "single.txt"}' \
anti-dog-sun.txt dog.txt

single.txt:

school
cat
moon

删除if,将每个替换放在一个sub()中,用;分隔每个sub(),然后打印single.txt.

相关:Replacing two strings using awk.