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.txt
、cat
和sun
中的两个字符串,分别使用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.txt
和2.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_0和code_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),如果解决方案应该查找字符串 dog
和 sun
.
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.
我正在 AWK User's Guide 阅读有关 sub()
的内容。
我想替换dog.txt
、cat
和sun
中的两个字符串,分别使用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.txt
和2.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_0和code_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),如果解决方案应该查找字符串 dog
和 sun
.
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.