我正在尝试创建一个 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
使用
tac
(反向打印文件)和awk
$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}
是这样的:处理完文件的最后一行后,
END
section 中的代码会执行一次,然后awk
结束。请参阅:https ://stackoverflow.com/tags/awk/info