Как сложить значения из определенных строк файла вместе, а затем удалить number?

Я пытаюсь создать сценарий 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


0
задан 16 August 2020 в 19:23

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] + $ / {сумма + = 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 завершается после этого.


] См .: https://stackoverflow.com/tags/awk/info

1
ответ дан 21 August 2020 в 07:58

Другие вопросы по тегам:

Похожие вопросы: