awk частично соответствует строке (если столбец / слово частично совпадают)

84

Мой фиктивный файл выглядит так:

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

Я хочу получить строку, если snowв $ 3 есть строка . Я могу сделать вот так:

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

Но должен быть способ попроще.

ПоГибас
источник

Ответы:

160
awk '$3 ~ /snow/ { print }' dummy_file 
Ахмед Масуд
источник
28
строго говоря, распечатка не нужна: '$3~/snow/'достаточно
SheetJS 08
2
К сожалению, эта ссылка уже мертва: вот текущая ссылка shop.oreilly.com/product/9781565924277.do
Stedy
Ваш узор - "снег", а если есть специальный символ, например [\ ", в моем случае индекс () - лучшее решение.
Цю Янгфань,
Есть ли способ аннулировать чек? Я знаю, что мы можем использовать «следующий» вместо «печать» и распечатать все остальное, но просто проверять что-то с меньшим количеством инструкций
Сахас
5
использовать! так, например, awk '$ 3! ~ / foo /'
Ахмед Масуд
41

Также возможно поиск подстроки с помощью функции index ():

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

Укороченная версия:

awk 'index($3, "snow")' dummy_file
Громовая говядина
источник
7
Это лучше, чем ответ Ахмеда Масуда, потому что он обрабатывает «снег» как буквальную строку, а не как регулярное выражение.
Ярно
6
Можно было бы написать еще проще:awk 'index($3, "snow")' dummy_file
jarno
2
Я согласен, что это лучше, чем мой ответ.
Ахмед Масуд
8

Выведите строки, в которых третье поле либо одно, snowлибо snowmanтолько:

awk '$3~/^snow(man)?$/' file
Крис Сеймур
источник
2

GNU sed

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

Вход:

C1 C2 C3    
1 снег   
2 б снеговик 
Снежный совник
      снег снег снеговик

..вывод:

1 снег
2 б снеговик
Эндоро
источник
9
Это не может быть более сложным ответом на довольно простой вопрос.
Sam
1
Кроме того, использовать sedслова целиком ОЧЕНЬ рискованно . Хотя это технически возможно, но для того, чтобы это работало надежно, мне приходилось использовать ретроспективный анализ, прогнозирование вперед, а также !?конструкции, когда речь шла о словах, которые не должны следовать. Это уж точно для слабонервных. (И склонен к ошибкам, на поиск и исправление которых может
уйти