如何将文件某些行的值添加到一起然后删除一个数字?

如何将文件某些行的值添加到一起然后删除一个数字?

我正在尝试创建一个 bash 脚本,该脚本将为我提供文件开头的原子总数,同时删除第二个原子数。但是我不确定该怎么做,因为我不能按列和行进行操作,第二个值可能会有所不同。任何提示都将不胜感激。这组分子的示例也很好。提前谢谢您。

例如:

18
     H           -1.246549   -3.377143   -1.800000
     C           -0.707293   -2.432587   -1.800000
     C           -1.403477   -1.241616   -1.800000
     C            0.707293   -2.432587   -1.800000
     C           -0.716360    0.000000   -1.800000
     H           -2.492687   -1.240767   -1.800000
     C            1.403477   -1.241616   -1.800000
     H            1.246549   -3.377143   -1.800000
     C            0.716360    0.000000   -1.800000
     C           -1.403477    1.241616   -1.800000
     H            2.492687   -1.240767   -1.800000
     C            1.403477    1.241616   -1.800000
     H           -2.492687    1.240767   -1.800000
     C           -0.707293    2.432587   -1.800000
     C            0.707293    2.432587   -1.800000
     H            2.492687    1.240767   -1.800000
     H           -1.246549    3.377143   -1.800000
     H            1.246549    3.377143   -1.800000
17
     C           -2.432587    0.707293    1.800000
     C           -1.241616    1.403477    1.800000
     C            0.000000    0.716360    1.800000
     C            0.000000   -0.716360    1.800000
     C           -1.241616   -1.403477    1.800000
     C           -2.432587   -0.707293    1.800000
     H            1.240767    2.492687    1.800000
     H           -3.377143    1.246549    1.800000
     H           -1.240767    2.492687    1.800000
     C            1.241616    1.403477    1.800000
     C            1.241616   -1.403477    1.800000
     H           -1.240767   -2.492687    1.800000
     H           -3.377143   -1.246549    1.800000
     C            2.432587   -0.707293    1.800000
     C            2.432587    0.707293    1.800000
     H            1.240767   -2.492687    1.800000
     H            3.377143   -1.246549    1.800000

通过将原子总数相加,同时删除第二个数字,将先前的文件变成如下所示的文件。

35
18
     H           -1.246549   -3.377143   -1.800000
     C           -0.707293   -2.432587   -1.800000
     C           -1.403477   -1.241616   -1.800000
     C            0.707293   -2.432587   -1.800000
     C           -0.716360    0.000000   -1.800000
     H           -2.492687   -1.240767   -1.800000
     C            1.403477   -1.241616   -1.800000
     H            1.246549   -3.377143   -1.800000
     C            0.716360    0.000000   -1.800000
     C           -1.403477    1.241616   -1.800000
     H            2.492687   -1.240767   -1.800000
     C            1.403477    1.241616   -1.800000
     H           -2.492687    1.240767   -1.800000
     C           -0.707293    2.432587   -1.800000
     C            0.707293    2.432587   -1.800000
     H            2.492687    1.240767   -1.800000
     H           -1.246549    3.377143   -1.800000
     H            1.246549    3.377143   -1.800000
     C           -2.432587    0.707293    1.800000
     C           -1.241616    1.403477    1.800000
     C            0.000000    0.716360    1.800000
     C            0.000000   -0.716360    1.800000
     C           -1.241616   -1.403477    1.800000
     C           -2.432587   -0.707293    1.800000
     H            1.240767    2.492687    1.800000
     H           -3.377143    1.246549    1.800000
     H           -1.240767    2.492687    1.800000
     C            1.241616    1.403477    1.800000
     C            1.241616   -1.403477    1.800000
     H           -1.240767   -2.492687    1.800000
     H           -3.377143   -1.246549    1.800000
     C            2.432587   -0.707293    1.800000
     C            2.432587    0.707293    1.800000
     H            1.240767   -2.492687    1.800000
     H            3.377143   -1.246549    1.800000


答案1

使用tac(反向打印文件)和awk

tac file | awk '$1~/^[0-9]+$/{sum+=$1; curr=$0; next} {print} END{print curr; print sum}' | tac

$1~/^[0-9]+$/使用正则表达式(^[0-9]+$)检查第一列是否包含数字。

更新:

awk$1~/^[0-9]+$/{sum+=$1; curr=$0; next} {print}对文件的每一行执行。

如果第一列包含数字,则将awk变量中的数字相加sum,并将当前行/行($0)保存在变量中curr,并在此停止执行当前行/行的代码,因为next。这意味着print在这种情况下不会执行该命令。

如果第一列不包含数字,则仅print执行。

另一种表示法$1~/^[0-9]+$/{sum+=$1; curr=$0; next} {print}是:

{
  if($1~/^[0-9]+$/)
    {sum+=$1; curr=$0}
  else
    {print}
}

当处理文件的最后一行时,部分代码END将执行一次然后awk结束。


看:https://stackoverflow.com/tags/awk/info

相关内容