我有这样的数据:
A=5 B=8 . C=8
A=4 . . C=4
A=8 . . C=3
我需要检查文件中的所有列,如果找到letter=number
(例如A = 5),我只需要打印number
。如果缺少值(.
),则跳过它。
所以输出应该是:
5 8 . 8
4 . . 4
8 . . 3
我会用awk:
awk -v OFS="\t" '{split($0,arr2,"="); print arr2[2]}' infile.txt
答案 0 :(得分:4)
这个awk单行与gawk一起工作:
awk -F'\\S*=' -v OFS="" '{$1=$1}7' file
5 8 . 8
4 . . 4
8 . . 3
我们的想法是:通过设置FOO=
FS
答案 1 :(得分:3)
快速而肮脏的方法是使用sed:
sed -e 's/[A-Z]\+=//g' infile.txt
这只删除了一串(一串)字母后面跟一个等号的所有实例。
答案 2 :(得分:2)
awk
对字段进行交互,如果字段以字母开头,则为=
,从而开始=
,然后awk '{for(i=1; i<=NF; i++) if($i~/^[A-Za-z]=[0-9]+$/) sub("^.*=", "", $i)}{print}'
,然后是最后的任何数字:< / p>
awk '{for(i=1; i<=NF; i++) if($i~/^[A-Za-z]+=[0-9]+$/) sub("^.*=", "", $i)}{print}'
如果你的一个字母而不是一个字母:
$ cat file.txt
A=5 B=8 . C=8
A=4 . . C=4
A=8 . . C=3
$ awk '{for (i=1; i<=NF; i++) if ($i~/^[A-Za-z]=[0-9]+$/) sub("^.*=", "", $i)} { print }' file.txt
5 8 . 8
4 . . 4
8 . . 3
示例:强>
Consume consume = new Consume();
consume.execute():
答案 3 :(得分:1)
使用GNU awk,你可以这样做:
$ awk -F= -vRS='[ \t\n]+' '{printf "%s%s", (NF>1?$NF:$0), RT}' file
5 8 . 8
4 . . 4
8 . . 3
Awk将其输入分配到记录中,并将记录分配到字段中。使用-vRS='[ \t\n]+'
,我们将记录分隔符设置为一系列空格,制表符或换行符。我们还将字段分隔符-F=
设置为等号。所以基本上我们将输入吐出到记录中,每个记录都是一个单词,然后我们使用=
作为分隔符将记录切割成字段。
使用此部分'{printf "%s%s", (NF>1?$NF:$0), RT}'
,我们打印所需的输出。对于每个记录,我们可以有两种情况:如果字段数(变量NF
)大于1,这意味着我们有一个等于,所以我们保留记录的最后一个字段{{1} }。如果记录有一个字段(不等于),我们保持字段不变。我们首先打印所需的值,然后打印分割字段时匹配的分隔符,该分隔符存储在$NF
变量中。
答案 4 :(得分:1)
awk '{gsub(/[A-Z]=/,"")}1' file
5 8 . 8
4 . . 4
8 . . 3