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


10

私はこの質問の解決策を見つけ出そうとしていました。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代わりにprint私の中にawk、私が得るvenkatvenkat3私が達成したかったされていない出力として。次のような出力が必要です

venkat
venkat3

質問2

これらの値を連想配列などとして使用して、値が実際に$1列にあるかどうかをどのように確認できますか?

私は何かを達成したかったのですが、

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

編集

私はawkステファンの解決に気づきませんでした。私が言ったのと同じことをしていますか?


1
ステファンawkは同じことをしていません。アプローチでは、単語がで区切られている場合にのみ、別の単語に含めることができると想定してい_ます。OPの例についても同様ですが、投稿された回答はすべて、doglionだけでなくのようなケースにも対応していdog_lionます。
terdon

回答:


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

私は表示する必要があるvenkatvenkat3OPは他の質問に尋ねあたりとして。後のキー_が私の$1列に存在するかどうかを確認しようとしています。
Ramesh

ああ、私は私の答えを更新しました!
cuonglm 2014年

素晴らしい解決策。私はあなたが他の質問のあなたの解決策にもこれを追加するべきだと思います:)
Ramesh

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のための良い解決策。短くてパリッとした:)
Ramesh

6

質問1

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

質問2

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

素晴らしい解決策。私はそれが好きです:)
Ramesh

question2のために、私だけを取得する予定venkatvenkat3彼らが存在しているように、出力として$1。ただし、$1コマンドに従ってすべての値を取得します。
Ramesh

@Ramesh:説明として、1列目に$2あるエントリを取得したいと思います$2。これは正しいですか?
cuonglm

@Gnouc、はい、あなたは正しいです。
Ramesh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.