私は解決策を見つけようとしていたこれ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
編集
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