видалити порожні рядки в 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

EDIT

Я не помітив 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в першій колонці. Чи це правильно?
cuonglm

@Gnouc, так, ти маєш рацію.
Рамеш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.