В простейшем случае, чтобы сохранить строки без :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
Используя awk
, мы можем выбрать требуемый столбец,
column -s, -t < myfile.txt | awk '$2 == "ST"'
Если используется переменная оболочки,
seg="ST"
column -s, -t < $ST_FILE | awk -v var="$seg" '($2 == var)'
Не прибегая к причудливому регулярному выражению с подсчетом запятых, для этой проблемы лучше использовать awk
.
awk -F, '$2=="ST"'
-F,
указывает разделитель, который устанавливается в виде запятой для ваших данных. $ 2
относится ко второму столбцу, который вы хотите сопоставить. «ST»
- это значение, которое вы хотите сопоставить. Получить 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