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

Posted

技术标签:

【中文标题】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 [closed] 【发布时间】:2021-12-25 18:36:29 【问题描述】:

我在这个AWK User's Guide 中读到了sub()

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

dog.txt:

school
dog
sun

anti-dog-sun.txt:

house
cat
moon

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

code_0:

awk \
'FNR==1 ++f
f==1 a[i++]=$0
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,即用moon替换sun,并将输出保存到2.txt,我使用了以下:

code_01:

  awk \
  'FNR==1 ++f
  f==1 a[i++]=$0
  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中,其中@最后的987654351@会这样:

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++]=$0
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 用户指南 几遍,并且我还尝试在操作系统中或从中寻求一些答案,并且我不确定是否可以仅使用 sub() 进行这两个替换。

编辑更新:如果你真的不能使用 sub() 执行 2 次替换,有没有办法做到这一点在 @ 中写入不止一次 987654358@文件?便携的解决方案? 一个满足我编辑的答案UPDATE 02

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

编辑更新 02: 另一个条件是应该维护机制 a[int((k++)%(x3*2)/x2)+x1],因为这个 MWE 是从这里awk - Replace each X nth occurs from anything between two strings in Different files using line range from another file 的这个问题的答案的实际使用中出现的。

编辑更新 03: 编辑问题时出现输入错误,我已将 dog.txt anti-dog-sun.txt 更正为 anti-dog-sun.txt dog.txt。对不起。

【问题讨论】:

对不起,我不太了解您的问题。假设您有两个文件,两个文件的行数相同(例如 3)。所以你想让 file1 中的第 2 行和第 3 行替换为 file2 中的相应行? 好吧....在完成“但是.....”部分后,您应该真正单击“添加评论”按钮..我不明白规则。对不起。祝你好运。 @Kent 对于您的第一条评论:如果我的问题是这样,但我想要的是查找一个字符串,然后替换某个第 n 行 anti-dog-sun.txt 行, 并对另一个 string1 执行此操作并替换某些 nth-1 anti-dog-sun.txt 行。 我的键盘被锁定了,我无法格式化 cmets 中的代码。 【参考方案1】:

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

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

【讨论】:

我会测试你的回复,但我在这里回复用户 Kent 评论的答案:对于你的第一条评论:如果我的问题是这样,但我想要的是寻找一个字符串然后替换某个第 n 行 anti-dog-sun.txt 行,并对另一个 string1 执行此操作并替换某些 nth-1 anti-dog-sun.txt 行。 关于您对答案的评论:假设您要执行替换而不考虑内容,请尝试:。那就靠宁找弦狗和弦太阳了。我的键盘被锁定,我无法格式化 cmets 中的代码。 我已经更新了我的答案。符合您的要求吗? 如果您知道自己的附加条件,可以相应地修改我的代码。你有什么问题? 如果您可以详细说明您的输入文件和扩展当前狗/猫示例的预期结果,而不是仅仅放置公式或链接到另一个帖子,这将有助于我们更好地了解您的要求和问题。干杯。【参考方案2】:

你可以使用head和tail:

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

【讨论】:

请阅读我的编辑更新 02。感谢您的帮助,我相信这个问题可能需要部分分解。【参考方案3】:

已解决:

awk \
'FNR==1 ++f
f==1 a[i++]=$0
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 - 使用另一个文件的第二行和第三行替换同一文件中的两个字符串的单个 f==2 文件号 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

用逗号替换新行,但我需要一行文件

numpy创建数组元素的获取

怎样把EXCEL表格的第一行和第二行锁定?让它们不动。

每天的 bigquery 聚合

使用 CSS 从表格的第二行替换行颜色

EXCEL里如何求第一行和指定一行,第二行和倒数第二行,第三行和倒数第三行。。。。。。的平均值?