awk部分的に文字列が一致する(列/単語が部分的に一致する場合)


83

私のダミーファイルは次のようになります。

C1    C2    C3    
1     a     snow   
2     b     snowman 
snow     c     sowman

snow$ 3に文字列がある場合は、行を取得したいと思います。私はこれを次のように行うことができます:

awk '($3=="snow" || $3=="snowman") {print}' dummy_file

しかし、もっと簡単な方法があるはずです。

回答:


157
awk '$3 ~ /snow/ { print }' dummy_file 

27
厳密に言えば、印刷は必要ありません:'$3~/snow/'十分
SheetJS 2013年

2
残念ながら、そのリンクはすでに無効になっ
product /

、\ [などの特殊記号があります場合は、 "私の場合、インデックスは()よりよい解決策である間、あなたのパターンは、「雪」である。
秋Yangfan

チェックを無効にする方法はありますか?「print」の代わりに「next」を使用して他のすべてを印刷できることはわかっていますが、指示が少ないものをチェックするだけです
Sahas

5
使用する !たとえば、awk '$ 3!〜/ foo /'
Ahmed Masud 2016年

41

index()関数で部分文字列を探すことによっても可能です。

awk '(index($3, "snow") != 0) {print}' dummy_file

短いバージョン:

awk 'index($3, "snow")' dummy_file

7
これは、「雪」を正規表現としてではなくリテラル文字列として処理するため、AhmedMasudの回答よりも優れています。
jarno 2015

6
あなたはそれをさらに簡単に書くことができます:awk 'index($3, "snow")' dummy_file
jarno 2015

2
私はこれが私の答えよりも優れていることに同意します。
Ahmed Masud


8

3番目のフィールドが次のいずれかsnowまたはsnowman唯一の行を印刷します。

awk '$3~/^snow(man)?$/' file

2

GNU sed

sed '/\s*\(\S\+\s\+\)\{2\}\bsnow\(man\)\?\b/!d' file

入力:

C1 C2 C3    
1雪   
2b雪だるま 
雪c雌豚
      雪雪snowmanx

..出力:

1雪
2b雪だるま

9
これは、かなり単純な質問に対するより複雑な答えではありません。
サム

1
さらに、sed単語全体に使用することは非常に危険です。技術的には可能ですが、それが確実に機能するためには、従う!?べきではない単語については、後ろ向き、前向き、および構文を使用する必要がありました。これは気弱な人には何の意味もありません、それは確かです。(そして、それらを見つけて修正するのに多くの時間を
費やす
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.