onefish
onechicken
twofish
twochicken
twocows
threechicken
如果我想grep包含“two”的行,但我只想要第二个匹配,该怎么办。所以我想要结果“twochicken”。只显示grep的第n个匹配
onefish
onechicken
twofish
twochicken
twocows
threechicken
如果我想grep包含“two”的行,但我只想要第二个匹配,该怎么办。所以我想要结果“twochicken”。只显示grep的第n个匹配
试试这个:
awk '/two/{i++}i==2' file
与您的数据:
kent$ echo "onefish
onechicken
twofish
twochicken
twocows
threechicken"|awk '/two/{i++}i==2'
twochicken
注:如果你的文件是巨大的,这样做:
awk '/two/{i++}i==2{print; exit}' file
如果字(这里word == two)在单行中重复多次,&要打印t该线,使用如下:
word=two
n=2
line=`grep -m$n $word -o -n MyFile | sed -n $n's/:.*//p'`
awk 'FNR=='$line'{print; exit}' MyFile
例如, 对于下面输入:
onefish
onechicken
twotwofish
twochicken
twocows
threechicken
将打印twotwofish
,而不是twochicken
。
这可能不是user1787038想要的,但添加回答我自己的评论。
grep行中的'-m $ n'只是为了一些优化,不是功能需要的。 – anishsane 2013-02-28 15:05:42
应当注意的是,如果threechicken
和twocows
线进行交换,又名:
onefish
onechicken
twofish
twochicken
threechicken
twocows
然后肯特的第一反应(awk '/two/{i++}i==2' file
)将产生输出:
twochicken
threechicken
,因为它需要另一发生匹配以增加计数器。他的最后回应:awk '/two/{i++}i==2{print; exit}' file
避免了这个问题。
第二个选项是优于文件大小,不是? – poncha 2013-02-28 12:27:18
@poncha,行号 – Kent 2013-02-28 12:31:40
你是什么意思的'行号'?我的意思是加入'{print;退出}'是任何输入大小的好主意......哦。这实际上是选项#3;)我算错了))) – poncha 2013-02-28 12:35:25