Grep 正確な数値一致

Grep 正確な数値一致

私は長いファイルの列2から正確な数を抽出するためにgrepを使用しています。

次のコードを使用しています。

grep  -e "^71161 |^71072 |^72617 " mainfile > outputfile

これは効果がありません。outputfile

助けてください。

私のファイルは次のとおりです。

Date        ID  STN     SUPER   LAT     LONG    OBS     VAR
2014060106  71072   146 S000438 48.37   270.68  2   0   
2014060106  71108   12  71108   49.03   237.63  0   0.04
2014060212  71108   12  71108   49.03   237.63  0   0.16    
2014060212  71120   12  71120   54.4    249.73  0   0   
2014060212  71123   12  S000400 53.32   246.42  0   0.11    
2014060212  71125   12  S000961 54.13   251.48  0.05    0.00
2014060212  71140   12  S000388 49.92   260.05  2   0.21    
2014060212  71150   146 71150   50.45   259.4   1   2.21    

答え1

awkより良いオプションは次のとおりです。

awk 'BEGIN{a[71161] a[71072] a[72617]}; $2 in a' < mainfile

または:

awk '$2 ~ /^(72617|71072|71161)$/' < mainfile

または:

awk '$2 == "71161" || $2 == "71072" || $2 == "72617"' < mainfile

(POSIX awk実装を使用すると(現在のLinuxディストリビューションでは一般的な実装ではありませんが)、==文字列に適用される演算子は2つの文字列が等しいかどうかをテストします。同じものを整理する、これは次のように異なる場合があります。平等。たとえば、UTF-8ロケールのGNUシステムでは、POSIX awkは"71161" == "٧١١٦١"trueを返します。したがって、これを防ぐために)LC_ALLに設定することをお勧めしますC

あなたもできます。数字比較する:

awk '$2 == 71161 || $2 == 71072 || $2 == 72617' < mainfile

また、71161.0、71.161e3、または0x115f9の2番目のフィールドを持つ行を返します(GNUの場合はawk16進数を考慮するために環境でPOSIXLY_CORRECTを渡す必要があります)。

関連情報