获取 awk 的第 N 个结果

获取 awk 的第 N 个结果

我尝试在两个模式之间查找文本,它成功了。但有时,我遇到不止一个,我需要获取所有文本并使用我想要的那个。

命令示例:

awk '/>23958742<\/PMID>/,/<\/PubmedArticle>/' file.xml

我想获取所有结果并分别查看每个结果。如何获取命令的第 N 个匹配项?

答案1

我觉得你在这里问了两个不同的问题,所以我将一一回答。

获取所有匹配项

这里发生了一些奇怪的事情,因为命令

awk '/>23958742<\/PMID>/,/<\/PubmedArticle>/' <file.xml

已经应该输出所有匹配项,而不仅仅是第一个匹配项。不过还有另一种方法(简短易读的版本):

awk '/>23958742<\/PMID>/{f=1}f==1;/<\/PubmedArticle>/{f=0}' <file.xml
awk '/>23958742<\/PMID>/ {f=1}; f==1 {print}; /<\/PubmedArticle>/ {f=0}' <file.xml

获取第 N 场比赛

awk '/>23958742<\/PMID>/{i++}i==2&&k==1;/<\/PubmedArticle>/{k++}' <file.xml
awk '/>23958742<\/PMID>/ {i++}; i==2 && k==1 {print}; /<\/PubmedArticle>/ {k++}' <file.xml

这将简单地计算字符串的出现次数,将计数保存在i和中k,只要条件i==2&&k==1仍然满足,就会打印每一行。我在这里选择了第二个块作为示例,对于第三个块,它将改为i==3&&k==2k计数来自条件,因为我明白你希望匹配的行也打印出来。如果你只想要之间搜索字符串将整个事情扭转过来:

awk '/<\/PubmedArticle>/{k++}i==2&&k==1;/>23958742<\/PMID>/{i++}' <file.xml
awk '/<\/PubmedArticle>/ {k++}; i==2 && k==1 {print}; />23958742<\/PMID>/ {i++}' <file.xml

我总是让 shell 打开输入文件并将其分配给程序的标准输入 ( <file.xml),因为这样做有许多优点,请参阅这里.我找到了帮助这里这里

提出的通用解决方案特登这是:

awk -vn=2 '/>23958742<\/PMID>/{i++;k=1}i==n&&k==1;/<\/PubmedArticle>/{k=0}' <file.xml
awk -vn=2 '/>23958742<\/PMID>/ {i++;k=1}; i==n && k==1 {print}; /<\/PubmedArticle>/ {k=0}' <file.xml

使用此功能您只需设置n选项-v,例如-vn=2第二场比赛。

相关内容