【问题标题】:Using awk to print range of columns for matching keys使用 awk 打印匹配键的列范围
【发布时间】:2021-11-26 05:46:28
【问题描述】:

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

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

【问题讨论】:

  • 你想用$0 = "$" $0做什么?
  • 我更新了脚本...这确实打印了匹配键的 2 列,但跳过了不匹配的行。

标签: shell unix awk


【解决方案1】:

你可以使用这个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 用于表格输出

【讨论】:

  • 感谢您的帮助!
  • 如果成功请考虑接受答案
【解决方案2】:

试试这个:

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

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

【讨论】:

  • 谢谢!非常有趣的方法
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2021-07-18
    • 2020-02-29
    • 2020-12-19
    • 1970-01-01
    • 2014-10-20
    • 2020-06-05
    相关资源
    最近更新 更多