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

Using awk to print range of columns for matching keys

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

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

主文件:

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 'FNR == NR {key[]; next}  in key {print ,;next} 1' keyfile mainfile

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

您可以使用这个 awk:

awk 'FNR == NR {key[]; next} {print ( in key ?  OFS  : [=10=])}' keyfile mainfile | column -t > outfile

cat outfile

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

这里:

  • 当我们在 key 数组中找到 </code> 时使用三元运算打印 <code> OFS 否则我们打印 [=15=].
  • 用于 column -t 表格输出

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

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