4

Linuxコマンドを使用して、テキストファイル内の文字列の最後の出現を見つけたい. 例えば

1 a 1
2 a 2
3 a 3
1 b 1
2 b 2
3 b 3
1 c 1
2 c 2
3 c 3

このようなテキスト ファイルで、b の最後の出現の行番号 6 を見つけたいと思います。最初の出現を見つけることができます

awk '/ b / {print NR;exit}' textFile.txt

しかし、最後の発生に対してそれを行う方法がわかりません。

4

3 に答える 3

9
cat -n textfile.txt | grep " b " | tail -1 |  cut -f 1
  • cat -nファイルを STDOUT の先頭に行番号を付けて出力します。
  • grep"b" を含むすべての行を grep します (より高度なパターンには egrep を使用し、固定文字列のより高速な grep には fgrep を使用できます)。
  • tail -1「b」を含む行の最後の行を出力します
  • cut -f 1からの行番号である最初の列を出力しますcat -n

または、必要に応じて Perl を使用することもできます (これは awk で行うことと非常に似ていますが、率直に言って、Perl が手元にあれば個人的に awk を使用することはありません。Perl は awk でできることの 100% を設計上サポートしています)。 、ワンライナーとして - YMMV):

perl -ne '{$n=$. if / b /} END {print "$n\n"}' textfile.txt 
于 2013-05-07T13:40:35.910 に答える
3

これは機能します:

$ awk '{if ($2~"b") a=NR} END{print a}' your_file

1 つおきのファイルが「b」であることを確認し、行数を記録します。追加されているため、ファイルの読み取りが完了するまでに、最後のファイルになります。

テスト:

$ awk '{if ($2~"b") a=NR} END{print a}' your_file
6

sudo_O advisorに基づく更新:

$ awk '{if ($2=="b") a=NR} END{print a}' your_file

2番目のフィールドにいくつか含まれないようにabcします。

これも有効です(短く、私が考えたものであるため、上記のものを保持します:D):

$ awk '$2=="b" {a=NR} END{print a}' your_file
于 2013-05-07T13:42:37.353 に答える
0

$2 が常にグループ化されている場合の別のアプローチ (最後まで待機するよりも効率的である可能性があります):

awk 'NR==1||$2=="b",$2=="b"{next} {print NR-1; exit}' file

また

awk '$2=="b"{f=1} f==1 && $2!="b" {print NR-1; exit}' file
于 2013-05-07T18:52:03.910 に答える