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



我有一个这样的数据:

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

这个awk一行程序使用gawk:

awk -F'\S*=' -v OFS="" '{$1=$1}7' file
5 8 . 8
4 . . 4
8 . . 3

思路是:通过设置FS

来删除FOO=

使用sed:

是一种快捷的方法
sed -e 's/[A-Z]+=//g' infile.txt

这只是删除一个(一堆)字母后面跟一个等号的所有实例。

awk对字段进行交互,如果字段以字母开头,则剥离=之前的部分,然后是=,然后是末尾的任何数字:

awk '{for(i=1; i<=NF; i++) if($i~/^[A-Za-z]=[0-9]+$/) sub("^.*=", "", $i)}{print}'

如果你想要一个由字母组成的单词而不是一个单词:

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

使用GNU awk,您可以这样做:

$ awk -F= -vRS='[ tn]+' '{printf "%s%s", (NF>1?$NF:$0), RT}' file
5 8 . 8
4 . . 4
8 . . 3
Awk将它的输入分成记录,并将记录分成字段。使用-vRS='[ tn]+',我们将记录分隔符设置为空格、制表符或换行符的序列。我们还使用-F=将字段分隔符设置为等号。因此,本质上我们将输入分割成记录,每个记录是一个单词,然后我们使用=作为分隔符将记录分割成字段。

使用'{printf "%s%s", (NF>1?$NF:$0), RT}'部分,我们打印所需的输出。对于每条记录,我们可以有两种情况:如果字段的数量(变量NF)大于1,这意味着我们有一个等号,所以我们保留$NF记录的最后一个字段。如果记录只有一个字段(没有等号),我们保持字段不变。首先打印所需的值,然后打印分割字段时匹配的分隔符,该分隔符存储在RT变量中。

awk '{gsub(/[A-Z]=/,"")}1' file
5 8 . 8
4 . . 4
8 . . 3

最新更新