Я пытался найти решение дляэтотвопрос. Я хотел использовать 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
Другой подход:
Вопрос 1
awk -F_ '$2{print $2}' file
Это будет напечатано только если $2
определено. Это более короткий способ записи:
awk -F_ '{if($2){print $2}}' file
вопрос 2
Мне нечего добавить, кроме того, что уже было рассмотрено.
решение2
Вопрос 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
решение3
для вопроса 1 вы можете использовать опцию --only-delimited
( -s
)cut
cut -s -f2 -d'_' file
venkat
venkat3
решение4
Вопрос 1
awk -F "_" '/_/ {print $2}' file
вопрос 2
awk -F "_" '{values[$1]=1;}; END {for (val in values) print val;}' file