Awk 通过在grep之后合并来替换行中的工作
我需要在执行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
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