我尝试在两个模式之间查找文本,它成功了。但有时,我遇到不止一个,我需要获取所有文本并使用我想要的那个。
命令示例:
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==2
。k
计数来自后条件,因为我明白你希望匹配的行也打印出来。如果你只想要之间搜索字符串将整个事情扭转过来:
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
第二场比赛。