如何使用awk或其他命令在命令行中打印长行列表中每个组的最后一行?

时间:2019-11-09 03:29:13

标签: bash awk

在bash中对许多文件使用grep,每个文件显示几行。因此,我想为每个文件获取最后一行。 使用grep后,输出如下:

- re0_400.out:  18 F= -.36810451E+02 E0= -.36810451E+02  d E =-.133023E-01
- re0_400.out:  19 F= -.36810451E+02 E0= -.36810451E+02  d E =-.133024E-01
- re0_400.out:  20 F= -.36797147E+02 E0= -.36797147E+02  d E =0.137473E-05
- re0_400s.out:   1 F= -.18286638E+02 E0= -.18286638E+02  d E =-.182866E+02
- re0_400s.out:   2 F= -.18277347E+02 E0= -.18277347E+02  d E =0.929017E-02
- re0_400s.out:   3 F= -.18293043E+02 E0= -.18293043E+02  d E =-.640539E-02
- re0_400s.out:   4 F= -.18293044E+02 E0= -.18293044E+02  d E =-.640678E-02
- re0_450.out:   1 F= -.36767212E+02 E0= -.36767212E+02  d E =-.367672E+02
- re0_450.out:   2 F= -.36750221E+02 E0= -.36750221E+02  d E =0.169913E-01
- re0_450.out:   3 F= -.36780151E+02 E0= -.36780151E+02  d E =-.129382E-01
- re0_450.out:   4 F= -.36780151E+02 E0= -.36780151E+02  d E =-.129384E-01

尝试的代码是:

awk '$1=="BB" && $2>1 {print f} {f=$1}' a.txt

这是用于在字段满足条件时打印上一行的代码(Print previous line if condition is met)。但就我而言,我需要在两行中比较相同的字段。

结果应该是

- re0_400.out:  20 F= -.36797147E+02 E0= -.36797147E+02  d E =0.137473E-05
- re0_400s.out:   4 F= -.18293044E+02 E0= -.18293044E+02  d E =-.640678E-02
- re0_450.out:   4 F= -.36780151E+02 E0= -.36780151E+02  d E =-.129384E-01

如何使用awk或shell中的任何命令在bash中获得此结果?

1 个答案:

答案 0 :(得分:1)

请尝试以下操作(在这里,我认为您的Input_file具有示例中显示的-哈希,以防万一您没有,请尝试将$2更改为{{1} }以下代码中。

$1

输出如下。

awk '
!a[$2]++{
  b[++count]=$2
}
{
  c[$2]=$0
}
END{
  for(i=1;i<=count;i++){
    print c[b[i]]
  }
}
'   Input_file


说明: :添加了上述代码的详细说明。

- re0_400.out:  20 F= -.36797147E+02 E0= -.36797147E+02  d E =0.137473E-05
- re0_400s.out:   4 F= -.18293044E+02 E0= -.18293044E+02  d E =-.640678E-02
- re0_450.out:   4 F= -.36780151E+02 E0= -.36780151E+02  d E =-.129384E-01