Обновить поле в указанном столбце c в соответствии с количеством предыдущих записей, используя awk - PullRequest
0 голосов
/ 21 марта 2020

Мне нужно обновить первое поле входного файла ниже (за исключением двух первых строк, которые являются заголовком. Число в первом столбце перед BGL, GL C и LIN - счетчик, который должен обновляться в таком виде Таким образом, счетчик увеличивается на единицу для каждой серии записей с одинаковыми молекулами BCL, GL C и LIN.

Ниже небольшого фрагмента моего входного файла (у меня есть 100 таких файлов):

900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
    1BGL     C5    1   2.709  14.491   1.493
    1BGL     H5    2   2.664  14.412   1.433
    1BGL     O5    3   2.717  14.464   1.627
    1BGL     C1    4   2.599  14.430   1.687
    1BGL     H1    5   2.546  14.350   1.634
    2GLC     O1   23   2.609  14.403   1.823
    2GLC     C1   24   2.675  14.276   1.837
    2GLC    H11   25   2.607  14.204   1.790
    3LIN     C3   44   3.033  14.281   2.268
    3LIN    H31   45   3.136  14.298   2.235
    4LIN     C3   87   3.108  13.927   2.066
    4LIN    H31   88   3.077  13.879   2.159
    1BGL     C5    1   2.709  14.491   1.493
    1BGL     H5    2   2.664  14.412   1.433
    1BGL     O5    3   2.717  14.464   1.627
    1BGL     C1    4   2.599  14.430   1.687
    1BGL     H1    5   2.546  14.350   1.634
    2GLC     O1   23   2.609  14.403   1.823
    2GLC     C1   24   2.675  14.276   1.837
    2GLC    H11   25   2.607  14.204   1.790
    3LIN     C3   44   3.033  14.281   2.268
    3LIN    H31   45   3.136  14.298   2.235
    4LIN     C3   87   3.108  13.927   2.066
    4LIN    H31   88   3.077  13.879   2.159
etc
    1BGL     C5    1   2.709  14.491   1.493
    1BGL     H5    2   2.664  14.412   1.433
    1BGL     O5    3   2.717  14.464   1.627
    1BGL     C1    4   2.599  14.430   1.687
    1BGL     H1    5   2.546  14.350   1.634
    2GLC     O1   23   2.609  14.403   1.823
    2GLC     C1   24   2.675  14.276   1.837
    2GLC    H11   25   2.607  14.204   1.790
    3LIN     C3   44   3.033  14.281   2.268
    3LIN    H31   45   3.136  14.298   2.235
    4LIN     C3   87   3.108  13.927   2.066
    4LIN    H31   88   3.077  13.879   2.159
etc
20389SOL     OW77253   0.644  14.144   5.376
20389SOL    HW177254   0.712  14.203   5.344
20389SOL    HW277255   0.577  14.201   5.413
   6.36535  23.37625  12.09434

Я хочу получить в качестве вывода:

900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
    1BGL     C5    1   2.709  14.491   1.493
    1BGL     H5    2   2.664  14.412   1.433
    1BGL     O5    3   2.717  14.464   1.627
    1BGL     C1    4   2.599  14.430   1.687
    1BGL     H1    5   2.546  14.350   1.634
    1GLC     O1   23   2.609  14.403   1.823
    1GLC     C1   24   2.675  14.276   1.837
    1GLC    H11   25   2.607  14.204   1.790
    1LIN     C3   44   3.033  14.281   2.268
    1LIN    H31   45   3.136  14.298   2.235
    1LIN     C3   87   3.108  13.927   2.066
    1LIN    H31   88   3.077  13.879   2.159
    2BGL     C5    1   2.709  14.491   1.493
    2BGL     H5    2   2.664  14.412   1.433
    2BGL     O5    3   2.717  14.464   1.627
    2BGL     C1    4   2.599  14.430   1.687
    2BGL     H1    5   2.546  14.350   1.634
    2GLC     O1   23   2.609  14.403   1.823
    2GLC     C1   24   2.675  14.276   1.837
    2GLC    H11   25   2.607  14.204   1.790
    2LIN     C3   44   3.033  14.281   2.268
    2LIN    H31   45   3.136  14.298   2.235
    2LIN     C3   87   3.108  13.927   2.066
    2LIN    H31   88   3.077  13.879   2.159
etc
  900BGL     C5    1   2.709  14.491   1.493
  900BGL     H5    2   2.664  14.412   1.433
  900BGL     O5    3   2.717  14.464   1.627
  900BGL     C1    4   2.599  14.430   1.687
  900BGL     H1    5   2.546  14.350   1.634
  900GLC     O1   23   2.609  14.403   1.823
  900GLC     C1   24   2.675  14.276   1.837
  900GLC    H11   25   2.607  14.204   1.790
  900LIN     C3   44   3.033  14.281   2.268
  900LIN    H31   45   3.136  14.298   2.235
  900LIN     C3   87   3.108  13.927   2.066
  900LIN    H31   88   3.077  13.879   2.159
etc
20389SOL     OW77253   0.644  14.144   5.376
20389SOL    HW177254   0.712  14.203   5.344
20389SOL    HW277255   0.577  14.201   5.413
   6.36535  23.37625  12.09434

В основном я использую такие сценарии, но этот случай более сложный, и этот сценарий бесполезен. Я знаю, что мне, наверное, следует использовать счетчик, но как напечатать это, если у меня разные имена (я имею в виду BGL, GL C, LIN), а также это трудно использовать (FNR% 22 == 0), потому что у меня 5 BGL, а затем 3 GL C затем 4 LIN.

#!/bin/bash
awk '
FNR==1{
  ++count
  value=count"BGL" (or whatever)
}
{
  $1=value
}
1
FNR%22==0{
  ++count
  value=count"BGL"
}
' after_SOL.gro | tee after_SOL2.gro

Я также сделаю это для многих файлов, поэтому я приведу свой сценарий для l oop:

#!/bin/bash
for num in {1..100}; 
do 
    (awk script here) eq4_$num.gro | tee eq5_$num.gro
done

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Этот скрипт должен перенумеровать молекулы.

#!/usr/bin/gawk -f
BEGIN{ mol=""; prev=""; }
{
        gsub(/[0-9]/,"",$1);
        mol=$1;
        if (mol==prev){
                nr=m[mol];
        }
        else {
                nr=++m[mol]
        };
        prev=mol;
        print nr$0
}

Порядковый номер каждой молекулы ('BGL', 'GL C', LIN ') хранится в массиве m[]. И увеличиваются при смене молекулы.

Надеюсь, это то, что планируете делать?

1 голос
/ 21 марта 2020

Я считаю, что этот скрипт выполняет именно то, что вы хотите, и сохраняет табличное форматирование ввода:

#!/bin/bash
awk '
NR <= 2 {print} /* skip two lines of headers */
NR > 2  {
  sub(/[0-9]*/, "", $1); 
  if ($1 != prev) {count[$1]++} 
  prev = $1
  printf ("%8s %6s %4s %7s %7s %7s\n", count[$1]$1, $2, $3, $4, $5, $6)
} ' data.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...