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

編集する

awk私はStephenの解決策に気づいていませんでした。私が言及したのと同じことをしていますか?

答え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

--only-delimited質問1の場合は(-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

関連情報