Использование 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
Во всяком случае, это выглядит обходной путь для меня, и у меня плохое предчувствие, что я не делаю на правильном пути.
Кто-то знает лучший способ или, по крайней мере, объяснить, почему первая и вторая попытки не сработали?
спасибо, ваш ответ дать мне еще один способ для записи: 'эхо - e "ABC \ tABC \ nDEF \ tAAA \ nGHI \ tABC" | awk '! ($ 1 ~/ABC /) {print}' DEF AAA GHI ABC' – ton
Как я уже сказал, вы можете опустить '{print}' в этом случае. – hek2mgl