Как использовать команду grep для столбца?

В простейшем случае, чтобы сохранить строки без :FOO, вы можете просто удалить :FOO и затем пройти через uniq:

$ sed 's/:FOO$//' file | uniq
red.7
green.2
blue.6
yellow.9

Если вы предпочитаете сохранить строки :FOO и предполагаете, что они всегда идут после своих собратьев без суффикса, вы можете попробовать:

$ rev file | sed 's/:/ /' | uniq -f1 | sed 's/ /:/' | rev
red.7
green.2:FOO
blue.6
yellow.9:FOO

rev печатает каждую строку справа налево. sed заменяет первый : пробелом, чтобы uniq мог использовать распознавание FOO (или OOF, в данном случае) в качестве первого поля, которое должно быть проигнорировано, следующий sed возвращает : обратно и финальный rev снова печатает слева направо.


К сожалению, несмотря на то, что утверждает документация, uniq использует в качестве разделителя полей не только пробел и табуляцию, но и практически любой неалфавитно-цифровой символ:

$ printf 'foo/1\nfoo/2\nfoo%%3\nfoo:4\n' 
foo/1
foo/2
foo%3
foo:4
$ printf 'foo/1\nfoo/2\nfoo%%3\nfoo:4\n'  | uniq -f1
foo/1

Это означает, что приведенное выше решение не будет работать, если у вас есть такие символы. В качестве альтернативы вы можете grep найти все случаи :FOO в вашем файле, удалить :FOO и передать результат в новый grep как список шаблонов, которых следует избегать:

$ grep -hFxv "$(grep ':FOO' file | cut -d: -f1)" file 
red.7
green.2:FOO
blue.6
yellow.9:FOO
3
10.01.2017, 18:42
3 ответа

Используя awk , мы можем выбрать требуемый столбец,

column -s, -t < myfile.txt | awk '$2 == "ST"'

Если используется переменная оболочки,

seg="ST"
column -s, -t < $ST_FILE | awk -v var="$seg" '($2 == var)'
0
27.01.2020, 21:08

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

awk -F, '$2=="ST"'
  • Параметр -F, указывает разделитель, который устанавливается в виде запятой для ваших данных.
  • $ 2 относится ко второму столбцу, который вы хотите сопоставить.
  • «ST» - это значение, которое вы хотите сопоставить.
14
27.01.2020, 21:08

Получить ST в столбце 2 ( -E и {1} здесь можно не указывать):

grep -E '^([^,]*,){1}ST[^,]*' file

Вывод:

3  ST  ST01  3  3  856
3  ST  ST02  4  9  0234

Получить ST в столбце 6:

grep -E '^([^,]*,){5}ST[^,]*' file | column -s, -t

Вывод:

6  N1  N101  2  3  ST
5
27.01.2020, 21:08

Теги

Похожие вопросы