一致がn回出現した後の行を出力する


8

次のファイルの4598行目を表示しようとしています。事実上、一致がn回出現した後に行を表示したい。この場合、の3番目の出現後の行<Car>。これについてどうすればよいですか?

<Car>
10456
</Car>
<Car>
70192
</Car>
<Car>
4598
</Car>

1
それはあなたが使用して欲しいものを達成することは可能かもしれませんがsedawk、あるいはgrep、それがXMLパーサを利用することをお勧めします。
devnull 2014

XMLは例としてのみ使用され、テキストはどのような形式でもかまいません
DJ180

回答:


10
awk -v n=3 '/<Car>/ && !--n {getline; print; exit}'

または:

awk '/<Car>/ && ++n == 3 {getline; print; exit}'

検索パターンを変数として渡すには:

var='<car>'
PATTERN="$var" awk -v n=3 '
  $0 ~ ENVIRON["PATTERN"] && ++n == 3 {getline; print; exit}'

ここでENVIRONは、-vasの代わりに使用すると、-vバックスラッシュエスケープシーケンスとバックスラッシュが正規表現でよく見られます(したがって、で二重にする必要があります-v)。

GNU awk4.2以降では、変数を厳密に型指定された正規表現として割り当てることができます。POSIXモードが有効になっていない限り(たとえば、$POSIXLY_CORRECT環境変数を介して)、次のことができます。

# GNU awk 4.2 or above only, when not in POSIX mode
gawk -v n=3 -v pattern="@/$var/" '
  $0 ~ pattern && ++n == 3 {getline; print; exit}'

上記のコマンドで検索パターンを変数として渡す方法
WanderingMind

@WanderingMind、編集を参照してください。
ステファンChazelas

4

これがperlのものです:

perl -ne 'print && exit if $c==3; $c++ if /<Car>/;' file 

GNU grepでは、次のようにその出力を解析することもできます。

grep -A 1 -m 3 '<Car>' file | tail -n 1

からman grep

-A NUM, --after-context=NUM
          Print NUM lines of trailing context after matching lines.  
          Places a line containing a group separator (--) between 
          contiguous  groups  of  matches.          
-m NUM, --max-count=NUM
          Stop reading a file after NUM matching lines.  


1

ここに別の方法がありsedます:

sed -n '/<Car>/{x;/.\{2\}/{x;$!{n;p};q};s/.*/&./;x}' infile

これはカウントにホールドスペースを使用しています。
たびにそれが一致する行遭遇した<Car>ことが電子x正確に存在する場合、変更バッファとチェックをN-1保持バッファ内の文字の出現を。チェックが成功した場合はx再度変更され、最後の行にない場合はnext行をp取り込み、パターンスペースをqリントしてからuitします。それ以外の場合.は、ホールドスペースに別の文字が追加され、e xが元に戻ります。


0

簡単なコマンドラインソリューションを次に示します。

grep -F -A1 '<Car>' filename | grep -E -v '<Car>|--' | tail -n +3 |head -n +1

の後で+3の値を変更する場合はtail、任意のn行目を指定できます。


タグ、sed、awkなどを追加した理由がわかりません。特定のアプリ、ユーティリティを使用してソリューションが必要な場合は、質問またはタイトルでこれを指定する必要があります。
bsd 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.