2016-08-15 77 views
0

我的输入文件(文件1)匹配的输入文件中的第一个值和第二列是这样的:AWK检索特定的模式后的文本,其中第一和第二列

part position col3 col4 info 
part1 34 1 1 NAME=Mark;AGE=23;HEIGHT=189 
part2 55 1 1 NAME=Alice;AGE=43;HEIGHT=167 
part2 19 1 1 NAME=Emily;AGE=16;HEIGHT=164 
part3 23 1 1 NAME=Owen;AGE=55;HEIGHT=181 
part3 99 1 1 NAME=Rachel;AGE=76;HEIGHT=162 

我需要找回info列中的“NAME =”后面的文本,但仅当前两列中的值与另一个文件(file2)匹配时。

part position 
part2 55 
part3 23 

那么只有第2,4行会被认为和之后的文本“NAME =”这些行被放入输出文件:

Alice 
Owen 

我不需要保留订单原始行的,所以下面的输出是同样有效:

Owen 
Alice 

我的(不太好)的尝试:

awk -F, 'FNR==NR {a[$1]=$5; next}; $1 in a {print a[$1]}' file1 file2 

回答

2

喜欢的东西,

awk -F"[ =;]" 'FNR==NR{found[$1" "$2]=$6; next} $1" "$2 in found{print found[$1" "$2]}' 

$ awk -F"[ =;]" 'FNR==NR{found[$1" "$2]=$6; next} $1" "$2 in found{print found[$1" "$2]}' file1 file2 
Alice 
Owen 

它能做什么?

  • -F"[ =;]"-F设置字段分隔符。在这里,我们将其设置为空间或=;。这样可以更轻松地从第一个文件中获取名称,而无需使用split函数。

  • found[$1" "$2]=$6此块仅适用于文件1运行,在这里我们$6索引的关联数组foundpart position

  • $1" "$2 in found{print found[$1" "$2]}这是第二个文件执行保存的名称。如果part position检查数组中被发现,如果是从阵列

+0

@JamesBrown打印名称这些文件是否按照awk的顺序排列。在上面的例子中,file1是文件'NAME'等 – nu11p01n73R

+0

优秀的答案。然而,我意识到我的文件是制表符分隔而不是空格分隔......我尝试用tab替换命令中的空格: awk -F“[\ t =;]”'FNR == NR {found [$ 1'\吨'$ 2] = $ 6;下一个} $ 1'\ t'$ 2找到{print found [$ 1'\ t'$ 2]}'file1 file2 但是没有输出... – HollowBastion

+0

@HollowBastion尝试字段分隔符为'-F“[[:space :] =] *“'。还要确保文件的顺序,它们非常重要 – nu11p01n73R

0

使用下面gnu awk会做同样的

awk 'NR>1 && NR==FNR{found[$1","$2];next}\ 
     $1","$2 in found{print gensub(/^NAME=([^;]*).*/,"\\1","1",$NF);}' file2 file1 

输出

Alice 
Owen 
相关问题