Awk 通过在grep之后合并来替换行中的工作

Awk 通过在grep之后合并来替换行中的工作,awk,sed,grep,cat,Awk,Sed,Grep,Cat,我需要在执行grep并获得结果的最后一行之后替换一个单词 下面是我的示例文件: aaa ts1 ts2 bbb ts3 ts4 aaa ts5 ts6 aaa ts7 NONE 我需要的是选择所有包含“aaa”的行,获取结果中的最后一行并替换为“无” 我试过了 cat <file> | grep "aaa" | tail -n 1 | sed -i 's/NONE/ts8/g' 但它不起作用 有什么建议吗 感谢使用tac+awk解决方案,请尝试以下内容 tac

我需要在执行grep并获得结果的最后一行之后替换一个单词

下面是我的示例文件:

aaa ts1 ts2
bbb ts3 ts4
aaa ts5 ts6
aaa ts7 NONE
我需要的是选择所有包含“aaa”的行,获取结果中的最后一行并替换为“无”

我试过了

cat <file> | grep "aaa" | tail -n 1 | sed -i 's/NONE/ts8/g'
但它不起作用

有什么建议吗

感谢使用tac+awk解决方案,请尝试以下内容

tac Input_file | awk '/aaa/ && ++count==1{sub(/NONE/,"ts8")} 1' | tac
一旦您对上述命令感到满意,请尝试执行以下操作,以就地保存到输入文件中

tac Input_file | awk '/aaa/ && ++count==1{sub(/NONE/,"ts8")} 1' | tac > temp && mv temp Input_file
说明:首先由tac以相反的顺序打印输入_文件,然后将其标准输出发送到awk作为输入,其中在第一行(实际上是包含aaa的最后一行)中将NONE替换为ts8。只需打印所有其他行,再次将输出发送到tac,以使其符合实际顺序,如输入文件的顺序。

使用tac+awk解决方案,请尝试以下操作

tac Input_file | awk '/aaa/ && ++count==1{sub(/NONE/,"ts8")} 1' | tac
一旦您对上述命令感到满意,请尝试执行以下操作,以就地保存到输入文件中

tac Input_file | awk '/aaa/ && ++count==1{sub(/NONE/,"ts8")} 1' | tac > temp && mv temp Input_file

说明:首先由tac以相反的顺序打印输入_文件,然后将其标准输出发送到awk作为输入,其中在第一行(实际上是包含aaa的最后一行)中将NONE替换为ts8。只需打印所有其他行,再次向tac发送输出,使其按实际顺序(如输入文件的顺序)运行。

对于在单个命令中执行此操作,这应适用于任何版本的awk:

awk'FNR==NR{if$1==aaa n=FNR;next}FNR==n{$3=TS7}1'文件{,} aaa ts1 ts2 bbb ts3 ts4 aaa ts5 ts6 aaa ts7 ts7 要将输出保存在同一文件中,请使用:

awk'FNR==NR{if$1==aaa n=FNR;next} FNR==n{$3=TS7}1'文件{,}>file.out&&mv file.out文件 或者使用gnu sed,您可以使用:

sed-i-Ez的/*\naaa[[:blank:]+[^[:blank:]+[[:blank:]]+无/\1ts8/'文件 cat文件 aaa ts1 ts2 bbb ts3 ts4 aaa ts5 ts6 aaa ts7 ts8
要在单个命令中执行此操作,这应适用于任何版本的awk:

awk'FNR==NR{if$1==aaa n=FNR;next}FNR==n{$3=TS7}1'文件{,} aaa ts1 ts2 bbb ts3 ts4 aaa ts5 ts6 aaa ts7 ts7 要将输出保存在同一文件中,请使用:

awk'FNR==NR{if$1==aaa n=FNR;next} FNR==n{$3=TS7}1'文件{,}>file.out&&mv file.out文件 或者使用gnu sed,您可以使用:

sed-i-Ez的/*\naaa[[:blank:]+[^[:blank:]+[[:blank:]]+无/\1ts8/'文件 cat文件 aaa ts1 ts2 bbb ts3 ts4 aaa ts5 ts6 aaa ts7 ts8
如果要在开始时获取与aaa匹配的最后一行,可以遍历所有行,并在结束块中打印最后一次出现的内容,并使用awk将无内容替换为ts8:

awk '$1=="aaa"{last=$0}END{sub(/NONE/,"ts8",last);print last}' file
部分:

$1=="aaa" {               # If the first field is aaa
  last=$0                 # Set variable last to the whole line (overwrite on each match)
}
END {                     # Run once at the end                
  sub(/NONE/,"ts8",last)  # Replace NONE with ts8 in the last variable
  print last                 
}
' file
输出

aaa ts7 ts8

如果要在开始时获取与aaa匹配的最后一行,可以遍历所有行,并在结束块中打印最后一次出现的内容,并使用awk将无内容替换为ts8:

awk '$1=="aaa"{last=$0}END{sub(/NONE/,"ts8",last);print last}' file
部分:

$1=="aaa" {               # If the first field is aaa
  last=$0                 # Set variable last to the whole line (overwrite on each match)
}
END {                     # Run once at the end                
  sub(/NONE/,"ts8",last)  # Replace NONE with ts8 in the last variable
  print last                 
}
' file
输出

aaa ts7 ts8