查找分隔符并打印第二个数组

时间:2016-09-26 11:17:07

标签: arrays bash awk split

我有这样的数据:

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

5 个答案:

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