awk ディスプレイの空白行を削除する

awk ディスプレイの空白行を削除する

私は解決策を見つけようとしていたこれawk質問です。解決策として使いたかったのです。

私の入力ファイルは以下のようなものです。

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

以下のようにコマンドを使用しawkて 2 番目の値を抽出しました_

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

ただし、上記のコマンドは正しい値を出力しますが、出力に空白行が表示されます。 2 つの質問があります。

質問1

出力内の空白行を削除して、出力にvenkatとのみが表示されるようにするにはどうすればよいですか?venkat3

printfの代わりにを使用すると、という出力が得られますが、これは私が達成したいものではありません。次のような出力が欲しいのです。printawkvenkatvenkat3

venkat
venkat3

質問2

これらの値を連想配列または、値が実際に$1列に出現するかどうかをどのように確認できますか?

私は次のようなことを達成したかったのです

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

編集

Stephane の解決策には気づきませんでした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

関連情報