使用awk打印匹配键的列范围



这似乎有一个简单的解决方案,但我卡住了。我想在密钥文件中查找主文件的第二列,对于任何匹配的密钥,只打印前2列,但其余的整个记录。我有一个工作脚本,但它打印匹配键的整行。你能帮帮我吗?

awk 'FNR == NR {key[$1]; next} $2 in key {print $1,$2}' keyfile mainfile > outfile

mainfile:

PSHELL      10  136514    0.7                
PSHELL      15  136514    0.7                
PSHELL      20  136513    2.0                  
PSHELL      30  13571     1.7 

密钥文件:

10
30

输出文件:

PSHELL      10                
PSHELL      15  136514    0.7                
PSHELL      20  136513    2.0                  
PSHELL      30

您可以使用此awk:

awk 'FNR == NR {key[$1]; next} {print ($2 in key ? $1 OFS $2 : $0)}' keyfile mainfile | column -t > outfile
cat outfile
PSHELL  10
PSHELL  15  136514  0.7
PSHELL  20  136513  2.0
PSHELL  30

:

  • 如果在key数组中找到$2,则使用三元运算打印$1 OFS $2,否则打印$0
  • 使用column -t作为表格输出

试试这个:

awk 'FNR == NR {key[$1]; next} $2 in key {print $1,$2;next} 1' keyfile mainfile

最后1表示一个空块的默认行为是打印整个线。
并与前块中的next结合,充当if else开关。

这里是执行相同操作的另一种方法。假设您不关心输出行的顺序,那么下面的内容可能也会对您有所帮助。

awk '
FNR==NR{
arr1[$2]=$1 OFS $2
arr2[$2]=$0
next
}
($1 in arr1){
print arr1[$1]
arr3[$1]
}
END{
for(key in arr2){
if(!(key in arr3)){
print arr2[key]
}
}
}
' mainfile keyfile

最新更新