多个条件存储在变量中,并在awk中像条件一样使用



table1.csv:

33622|AAA
33623|AAA
33624|BBB
33625|CCC
33626|DDD
33627|AAA
33628|BBB
33629|EEE
33630|FFF

目标:

33622|AAA
33623|AAA
33624|BBB
33625|CCC
33626|DDD
33627|AAA
33628|BBB

使用命令:

awk 'BEGIN{FS="|";OFS="|"} {if($2=="AAA" && $2=="BBB" && $2=="CCC" && $2=="DDD"){print $1,$2}}' table1.csv

然而,由于类别可能会增加,因此尝试更加自动化。

list1.csv:
AAA BBB CCC DDD
list=`cat list1.csv`
awk -v list=$list 'BEGIN{FS="|";OFS="|"} {if($2==list){print $1,$2}}' table1.csv

这意味着,我可以存储$2==";AAA"&amp$2=";BBB"。。。。。。。使用list1.csv?

预期输出:

33622|AAA
33623|AAA
33624|BBB
33625|CCC
33626|DDD
33627|AAA
33628|BBB

那么,关于将多个条件存储在一个变量中,有什么建议吗?

谢谢大家!

$ awk 'NR==FNR{for(i=1;i<=NF;i++)a[$i];next}FNR==1{FS="|";$0=$0}($2 in a)' list table

输出:

33622|AAA
33623|AAA
33624|BBB
33625|CCC
33626|DDD
33627|AAA
33628|BBB

解释:

$ awk '
NR==FNR {                # process list
for(i=1;i<=NF;i++)   # hash all items in file
a[$i]
next                 # possibility for multiple lines
}
FNR==1 {                 # changing FS in the beginning of table file
FS="|"
$0=$0
}
($2 in a)' list table

几乎相同的逻辑就像James Brown的好答案一样,只是在这里添加了一个小变体,即在Input_file中设置字段分隔符。

awk 'FNR==NR{for(i=1;i<=NF;i++){arr[$i]};next} ($2 in arr)' list FS="|" table

解释:添加以上详细解释。

awk '                   ##Starting awk program from here.
FNR==NR{                ##Checking condition which will be TRUE when list is being read.
for(i=1;i<=NF;i++){   ##Going through all fields here.
arr[$i]             ##Creating arr with index of current column value here.
}
next                  ##next will skip all further statements from here.
}
($2 in arr)             ##Checking condition if 2nd field is present in arr then print that line from table file.
' list FS="|" table     ##mentioning Input_file(s) here and setting FS as | before table file.

最新更新