удалить пустые строки в отображении awk


10

Я пытался найти решение этого вопроса. Я хотел использовать awkдля решения.

Мой входной файл - что-то вроде ниже.

-bash-3.2$ cat file
ramesh
ramesh_venkat
ramesh3_venkat3
ramesh4
ramesh5
venkat
venkat3
venkat4

Я использовал awkкоманду, чтобы извлечь вторые значения после, _как показано ниже.

awk -F "_" '{print $2}' file

Однако, хотя приведенная выше команда выводит правильные значения, я получаю пустые строки в своем выводе. У меня есть 2 вопроса.

Вопрос 1

Как я могу удалить пустые строки в выводе, чтобы я получил только venkatи venkat3в выводе?

Если я использую printfвместо printмоего awk, я получаю venkatvenkat3как результат, который я не хотел достичь. Я хочу вывод, как,

venkat
venkat3

вопрос 2

Используя эти значения в качестве ассоциативного массива или как-то, как я могу найти, если значения действительно встречаются в $1столбце?

Я хотел достичь чего-то вроде,

awk -F "_" '$2==1{print $1}' file

РЕДАКТИРОВАТЬ

Я не заметил awkрешение Стефана. Это делает то же самое, что я упомянул?


1
Стефан awkне делает то же самое. Ваш подход предполагает, что слово может содержаться в другом, только если оно разделено _. Хотя это верно для примера ОП, все опубликованные ответы также касаются таких случаев, как doglionи не только dog_lion.
Тердон

Ответы:


8

Вопрос 1

$ awk -F _ 'NF > 1 {print $2}' file
venkat
venkat3

Вопрос 2

$ awk -F _ '
    NR == FNR {a[$1];next}
    ($2 in a) {print $2}
' file file
venkat
venkat3

Мне нужно отобразить venkatи venkat3согласно ОП, заданному в другом вопросе. Я пытаюсь найти, присутствует ли ключ после _в моем $1столбце.
Рамеш

О, я обновил свой ответ!
cuonglm

Хорошее решение. Я думаю, что вы должны добавить это также к вашему решению в другом вопросе :)
Рамеш

8

для вопроса 1 вы можете использовать опцию --only-delimited( -s)cut

cut -s -f2 -d'_' file
venkat
venkat3

8

Другой подход:

Вопрос 1

awk -F_ '$2{print $2}' file

Это будет печатать, только если $2определено. Это более короткий способ записи:

awk -F_ '{if($2){print $2}}' file

вопрос 2

Не нужно ничего добавлять, что еще не было решено.


1
Хорошее решение для вопроса1. Короткий и четкий :)
Рамеш

6

Вопрос 1

awk -F "_" '/_/ {print $2}' file

вопрос 2

awk -F "_" '{values[$1]=1;}; END {for (val in values) print val;}' file

Хорошее решение. Мне нравится :)
Рамеш

Для вопроса 2 я намерен получить только venkatи в venkat3качестве вывода, как они присутствуют в $1. Тем не менее, я получаю все $1значения в соответствии с вашей командой.
Рамеш

@Ramesh: Как вы описываете, я думаю, что вы хотите получить $2запись, которая $2произошла в 1-м столбце. Это правильно?
cuonglm

@ Gnouc, да, ты прав.
Рамеш
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.