Awk:行

このファイルがあります

a deiauk Biking US 200 G b kespaul 202 A c deiauk NY 222 5 Z 

そして私はawkを使用して正確な文字列200に一致させたい。したがって、私の結果は次のようになります

a deiauk Biking US 200 G 

ここに私のコードがあります

awk -F " " "{if($(NF-1) ~ /200/){a[$1]++}}END{for (var in a){print a[var] " " var " " $(NF-1)}}" file.txt 

すべての行を取得しました。

コメント

  • awkコードで1行ですか?これが何をするのかわざわざ理解しましたか?
  • あなたのawkはi)最後から2番目のフィールドが; ii)1番目のフィールドとiii)最後から2番目のフィールド。なぜ行全体が出力されると思いますか?実際にどのような出力が得られますか?

回答

完全一致が必要なため、==を使用しませんか?

$ cat >file a deiauk Biking US 200 G b kespaul 202 A c deiauk NY 222 5 Z a auie auie 200 B b nrst nrst 200 C $ awk "$(NF-1)==200{a[$1]++}END{for (v in a){print v,a[v]}}" file a 2 b 1 

/^200$/で試合を制限することもできます:

$ awk "$(NF-1)~/^200$/{a[$1]++}END{for (v in a){print v,a[v]}}" file a 2 b 1 

編集:

コマンドを試しましたが、機能するはずです。-F " "を確認しますか?

Comm ents

  • はい-F ' 'は私の状況では問題ありません。 '理由はわかりませんが、同じ問題が発生します

回答

awkの場合、次のようになります:

awk "$0~/ 200 /" file 

またはsed\sは任意の空白に一致します):

sed -n "/\s200\s/p" file 

A grepソリューション(perl正規表現の場合は-P):

grep -P "\s200\s" file 

純粋である必要がある場合bash

while read a; do [[ $a =~ " 200 " ]] && echo $a; done <file 

スペースやタブなどがあるかどうかわからない場合([[:space:]]は、上記のsedおよびgrepソリューションの\sに似ています。 ):

while read a; do [[ $a =~ [[:space:]]200[[:space:]] ]] && echo $a; done <file 

コメント

  • grep -Pがなくても機能し、grep '\s200\s' file

回答

私はこれだと思いますsが役立ちます。これにより、パターンを含む行のみが印刷されます。あなたの場合のパターンは200です

grep "200" file-name 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です