Я пытаюсь создать сценарий 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
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] + $ / {сумма + = 1 доллар; curr = $ 0; next} {print}
для каждой строки вашего файла.
Если первый столбец содержит число, то awk
складывает числа в переменной sum
и сохраняет текущую строку / row ( $ 0
) в переменной curr
и прекращает выполнение кода для текущей строки / строки здесь из-за next
. Это означает, что команда print
в этом случае не выполняется.
Если первый столбец не содержит числа, то выполняется только print
.
Другое обозначение для $ 1 ~ / ^ [0-9] + $ / {сумма + = $ 1; curr = $ 0; next} {print}
это:
{
if($1~/^[0-9]+$/)
{sum+=$1; curr=$0}
else
{print}
}
Когда обрабатывается последняя строка вашего файла, код в секции END
выполняется один раз, а awk
завершается после этого.