我试图找出这个问题的解决方案。我想awk
用于解决方案。
我的输入文件如下所示。
-bash-3.2$ cat file
ramesh
ramesh_venkat
ramesh3_venkat3
ramesh4
ramesh5
venkat
venkat3
venkat4
Run Code Online (Sandbox Code Playgroud)
我使用awk
命令来提取第二个值_
,如下所示。
awk -F "_" '{print $2}' file
Run Code Online (Sandbox Code Playgroud)
但是,虽然上面的命令打印了正确的值,但我的输出中却出现了空行。我有2个问题。
问题 1
如何删除输出中的空行,以便只获得venkat
和venkat3
输出?
如果我在 my 中使用printf
而不是,我会得到我不想实现的输出。我想要这样的输出,print
awk
venkatvenkat3
venkat
venkat3
Run Code Online (Sandbox Code Playgroud)
问题2
使用这些值作为关联数组或其他东西,我如何找到这些值是否实际出现在$1
列中?
我想实现类似的目标,
awk -F "_" '$2==1{print $1}' file
Run Code Online (Sandbox Code Playgroud)
编辑
我没有注意到awk
斯蒂芬的解决方案。它是在做我提到的同样的事情吗?
ter*_*don 10
另一种方法:
awk -F_ '$2{print $2}' file
Run Code Online (Sandbox Code Playgroud)
这只会在$2
定义时打印。这是一种较短的写作方式:
awk -F_ '{if($2){print $2}}' file
Run Code Online (Sandbox Code Playgroud)
不要添加任何尚未解决的内容。
问题1
$ awk -F _ 'NF > 1 {print $2}' file
venkat
venkat3
Run Code Online (Sandbox Code Playgroud)
问题2
$ awk -F _ '
NR == FNR {a[$1];next}
($2 in a) {print $2}
' file file
venkat
venkat3
Run Code Online (Sandbox Code Playgroud)
对于问题 1,您可以使用--only-delimited
( -s
) 选项cut
cut -s -f2 -d'_' file
venkat
venkat3
Run Code Online (Sandbox Code Playgroud)
问题 1
awk -F "_" '/_/ {print $2}' file
Run Code Online (Sandbox Code Playgroud)
问题2
awk -F "_" '{values[$1]=1;}; END {for (val in values) print val;}' file
Run Code Online (Sandbox Code Playgroud)