40
onefish
onechicken
twofish
twochicken
twocows
threechicken

「2」を含む行をgrepしたいが、2番目の一致のみが必要な場合はどうなりますか。だから私は結果「twochicken」が欲しいです。

4

6 に答える 6

36
grep -m2 "two" in-file.txt | tail -n1

2 番目の一致の後で停止し、2 番目の行を出力します。

于 2013-02-28T12:23:55.190 に答える
33

これを試して:

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
于 2013-02-28T12:24:28.203 に答える
8

grep と sed を使用して、行番号をフィルタリングできます。

テストファイル:

onefish
onechicken
twofish
twochicken
threechicken
twocows

目的の行を取得する:

grep "two" testfile | sed -n 2p
prints "twochicken"

grep "two" testfile | sed -n 1p
prints "twofish"
于 2019-01-12T00:02:46.103 に答える
1

単語 (ここでは word==two) が 1 行で複数回繰り返され、その行を印刷したい場合は、以下を使用します。

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 が望むものではないかもしれませんが、私自身のコメントに答えるために追加されました。

于 2013-02-28T15:04:47.617 に答える
1

threechicken行とtwocows行が入れ替わった場合、別名:

onefish
onechicken
twofish
twochicken
threechicken
twocows

次に、Kent の最初の応答 ( awk '/two/{i++}i==2' file) により、次の出力が生成されます。

twochicken
threechicken

カウンターをインクリメントするには、別の一致が発生する必要があるためです。彼の最後の応答:awk '/two/{i++}i==2{print; exit}' fileこの問題を回避します。

于 2016-10-24T20:36:54.440 に答える