我正在尝试创建一个 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
结束。