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слова целиком ОЧЕНЬ рискованно . Хотя это технически возможно, но для того, чтобы это работало надежно, мне приходилось использовать ретроспективный анализ, прогнозирование вперед, а также !?конструкции, когда речь шла о словах, которые не должны следовать. Это уж точно для слабонервных. (И склонен к ошибкам, на поиск и исправление которых может
уйти
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.