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

2
На жаль, це посилання вже мертве: Ось поточне посилання shop.oreilly.com/product/9781565924277.do
Стеді,

Ваш шаблон - "сніг", хоча, якщо в моєму випадку є спеціальний символ, наприклад [\ ", індекс () є кращим рішенням.
Qiu Yangfan

Чи є спосіб заперечити чек? Я знаю, що ми можемо використовувати `` далі '' замість `` друк '' і друкувати все інше, але просто перевіряючи щось із меншою кількістю вказівок
Сахас,

5
використовувати! так, наприклад, awk '$ 3! ~ / foo /'
Ахмед Масуд

41

Також можливо, шукаючи підрядок з функцією index ():

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

Коротша версія:

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

7
Це краще, ніж відповідь Ахмеда Масуда, оскільки він обробляє "сніг" як буквальний рядок, а не як регулярний вираз.
jarno

6
Ви можете написати це ще простіше:awk 'index($3, "snow")' dummy_file
jarno

2
Я згоден, що це краще, ніж моя відповідь.
Ахмед Масуд



2

GNU sed

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

Вхідні дані:

C1 C2 C3    
1 сніг   
2 б сніговик 
сніг c сівщик
      сніг сніг сніговик

.. вихід:

1 сніг
2 б сніговик

9
Це не може бути більш складною відповіддю на досить пряме запитання.
Сем

1
Крім того, ДУЖЕ ризиковано використовувати sedцілі слова. Хоча технічно можливо, але для того, щоб це працювало надійно, мені довелося використовувати огляд із затримкою, з переглядом уперед, а також !?конструкції, коли мова йшла про слова, яких не слід було б слідувати. Це нічого для людей із вадами серця, це точно. (І схильний до помилок, які можуть забирати багато часу на їх пошук та виправлення.)
syntaxerror
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.