Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用awk根据以前记录的计数更新特定列中的字段_Awk_Text Processing - Fatal编程技术网

使用awk根据以前记录的计数更新特定列中的字段

使用awk根据以前记录的计数更新特定列中的字段,awk,text-processing,Awk,Text Processing,我必须更新下面输入文件的第一个字段(不包括作为标题的前两行。BGL、GLC和LIN之前第一列中的数字是一个计数器,必须以这样一种方式进行更新,即对于具有相同分子BCL、GLC和LIN的每一系列记录,计数器增加一个 下面是我输入文件的一小部分(我有100个这样的文件): 我希望将以下内容作为输出: 900 mgdg molecules in water t= 600000.00000 step= 400000000 177255 1BGL C5 1 2.709 14.4

我必须更新下面输入文件的第一个字段(不包括作为标题的前两行。BGL、GLC和LIN之前第一列中的数字是一个计数器,必须以这样一种方式进行更新,即对于具有相同分子BCL、GLC和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
    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,GLC,LIN),如何打印这个,也很难使用这个(FNR%22==0),因为我有5个BGL,3个GLC,然后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
我还将在许多文件上执行此操作,因此我将在for循环中pyt我的脚本:

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

我相信此脚本完全符合您的要求,并保留了输入的表格格式:

!/bin/bash
awk'
NR 2{
分(/[0-9]*/,“”,$1);
如果($1!=prev){count[$1]+}
上一期=$1
printf(“%8s%6s%4s%7s%7s%7s\n”,计数[$1]$1、$2、$3、$4、$5、$6)
}'data.txt

我相信此脚本完全符合您的要求,并保留了输入的表格格式:

!/bin/bash
awk'
NR 2{
分(/[0-9]*/,“”,$1);
如果($1!=prev){count[$1]+}
上一期=$1
printf(“%8s%6s%4s%7s%7s%7s\n”,计数[$1]$1、$2、$3、$4、$5、$6)
}'data.txt

此脚本应重新编号分子

#!/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','GLC',LIN')序列号都保存在一个数组中
m[]
。并且随着分子的变化而增加


我希望这就是我们计划做的事情?

这个脚本应该对分子重新编号

#!/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','GLC',LIN')序列号都保存在一个数组中
m[]
。并且随着分子的变化而增加


我希望这就是我们计划在哪里做的?

你能用文字解释一下你的输入和输出之间的区别吗?是的,在我输入的第一列中:1BGL..2GLC..3LIN..4LIN..1BGL..2GLC..3LIN..4LIN..1BGL..2gl..2GLC..2LIN 3GLC..3LIN。在输出中,我想有1BGL..1GLC..1LIN 1LIN 1LIN然后是2gl 2GLC..3GLC..3L在Etcy中,如果您想对进行排序?,则不需要awk来进行排序……不,我不想进行排序。我想重命名每个原子中的第一列(每个原子都是一行).排序在这种情况下是无用的,我有900个分子,所以我需要1个BGL/GLC/LIN,2个BG/GLC/LIN,3个BGL,GLC/LIN 4,5,6个BGL/GLC LIN等。现在我到处都有1BGL,到处都有2个GLC,到处都有3个LIN,到处都有4个LIN。但你是对的。也许首先我应该排序,这样我会有例如10000行BGL,然后是20000行BGLGLC和50000行LIN,然后我将使用脚本,我将其粘贴在这里,因此我可以使用例如(NR>=3&&NR您未能定义原子,但我猜它是“BGL”、“GLC”、“LIN”等。您能用语言解释一下您的输入和输出之间的区别吗?是的,在我输入的第一列中:1BGL..2GLC..3LIN..4LIN..再1BGL..2GLC..3LIN 4LIN再1BGL..2GLC..3LIN 4LIN在输出中我想要1BGL..1GLC..1GLC..1GLC..1GLC..1LIN 1n 2BGL..2GLC..2LIN然后3BGL..3GLC..3LIN等等如果您想
排序
?,您不需要awk来进行排序…不,我不想排序。我想重命名每个原子中的第一列(每个原子都是一行).排序在这种情况下是无用的,我有900个分子,所以我需要1个BGL/GLC/LIN,2个BG/GLC/LIN,3个BGL,GLC/LIN 4,5,6个BGL/GLC LIN等。现在我到处都有1BGL,到处都有2个GLC,到处都有3个LIN,到处都有4个LIN。但你是对的。也许首先我应该排序,这样我会有例如10000行BGL,然后是20000行BGLGLC和50000行LIN,然后我将使用脚本,我将其粘贴在这里,因此我可以使用(NR>=3&&NRyou未能定义
atom
,但我猜它是“BGL”、“GLC”、“LIN”等。。