2015-03-17 5 views
1

Использование AWK, мне нужно избегать линий печати с определенным словом в определенном поле ... Прежде чем кто-то назовет это дубликат, я выполнил поиск и нашел это: Match string not containg a certain phrase, но я думаю, что это другое контекст, потому что здесь мне нужно совпадение в определенном столбце.строки awk не совпадают

Учитывая данные:

ABC  ABC 
DEF  AAA 
GHI  ABC 

Я хочу, чтобы фильтровать печатать полные строки только с текстом, не содержащие ABC в кулак поля (линии 2 и 3).

В первой попытке, я попытался (?!...) и должен работать таким образом, чтобы вернуть DEF и GHI:

echo -e "ABC\tABC\nDEF\tAAA\nGHI\tABC" | awk '$1 ~ /(?!ABC)/ {print}' 

но не возвращают ничего.

Второй попробуете ... используя не до выражения !/.../:

~$ echo -e "ABC\tABC\nDEF\tAAA\nGHI\tABC" | awk '$1 ~ !/ABC/ {print}' 

Return ничего слишком.

Я не понимаю, почему ...

Так еще один выстрел не удается (как и следовало ожидать на этот раз):

~$ echo -e "ABC\tABC\nDEF\tAAA\nGHI\tABC" | awk '!/ABC/ {print}' 
DEF  AAA 

Как и ожидалось, на этот раз, второе поле фильтровали тоже. Таким образом, кажется, что он работает только с $0.

Тогда я сделал свою домашнюю работу и получил это работает так:

~$ echo -e "ABC\tABC\nDEF\tAAA\nGHI\tABC" | awk '{FL=$0;$0=$1}; !/ABC/ {print FL}; { $0=FL }' 
DEF  AAA 
GHI  ABC 

Во всяком случае, это выглядит обходной путь для меня, и у меня плохое предчувствие, что я не делаю на правильном пути.

Кто-то знает лучший способ или, по крайней мере, объяснить, почему первая и вторая попытки не сработали?

ответ

2

Вы можете использовать следующую идиому:

awk '$1 !~ /ABC/' file 

Если первое поле не содержит ABC строка печатается. (соответствует не оператором является !~). Обратите внимание, что команда содержит только условие и не действует print. Это может работать, поскольку действие по умолчанию в awk равно print и поэтому не нужно явно указывать.

+0

спасибо, ваш ответ дать мне еще один способ для записи: 'эхо - e "ABC \ tABC \ nDEF \ tAAA \ nGHI \ tABC" | awk '! ($ 1 ~/ABC /) {print}' DEF AAA GHI ABC' – ton

+1

Как я уже сказал, вы можете опустить '{print}' в этом случае. – hek2mgl

0

Это awk должны сделать:

awk '!/^ABC/' file 
DEF  AAA 
GHI  ABC 

Он будет печатать строки, не (!), начиная (^) с ABC

+0

Хорошо, в примере я использовал первое поле, но вопрос касается любого поля. – ton

Смежные вопросы