【问题标题】:Rename first column in specific way in awk [closed]在awk中以特定方式重命名第一列[关闭]
【发布时间】:2020-12-28 23:03:53
【问题描述】:

这是我的输入文件

900 mgdg molecules in water t= 953400.00000 step= 635600000
177255
    1BGL     C5    1   4.977  15.059   2.068
    1BGL     H5    2   5.025  15.020   2.158
    1BGL     O5    3   4.881  14.948   2.052
...(a lot of lines between)
...
    4LIN    HI216099   1.909  19.279   7.886
    4LIN    HI316100   1.849  19.417   7.987 (the last line, which I want to modify is 116102)
...
...
20389SOL    HW177254   0.325   8.307   3.850
20389SOL    HW277255   0.245   8.235   3.957
   5.75588  25.65343  12.14665

我的输出文件应该是这样的

900 mgdg molecules in water t= 953400.00000 step= 635600000
177255
    1MGD     C5    1   4.977  15.059   2.068
    1MGD     H5    2   5.025  15.020   2.158
    1MGD     O5    3   4.881  14.948   2.052
...(a lot of lines between)
...
  900MGD    HI216099   1.909  19.279   7.886
  900MGD    HI316100   1.849  19.417   7.987 (the last line, which I want to modify is 116102)
...
...
20389SOL    HW177254   0.325   8.307   3.850
20389SOL    HW277255   0.245   8.235   3.957
   5.75588  25.65343  12.14665

我只想修改 100 个文件中的第一列。我每增加 129 行的价值。例如,第一列中的第 3-131 行有 1MGD,然后是第 132-260 - 2MGD 行,再到 116102 行。

这是我的脚本,但它不起作用

#!/bin/bash
for index in {1..100} 
do
    awk 'BEGIN { grp = 129 }
        {if (NR>=3 && NR<=116102) { 

        for (i=1; i<=116102; i++) {
                    $1 = (int($i/grp)+1)"MGD"
        }
        }; print $0}' eq15_$index.gro | tee eq2_15_$index.gro
done

你能帮帮我吗?

【问题讨论】:

  • edit 您的问题显示minimal reproducible example,其中包括简洁、可测试的样本输入和预期输出。例如,为了使示例最小,您可以将 100 个文件更改为 2 个文件、129 行更改为 3 行、116102 行更改为 8 行等,这样您就可以发布 2 个不再存在的示例输入文件每行超过 10 行(没有任何 ...s),但它们会重现您的问题,您可以稍后扩展自己以应用您的实际值。即,给我们一些可以阐明您的要求的东西,我们可以测试一个潜在的解决方案。

标签: awk text-processing


【解决方案1】:
awk 'NR>=3 && NR<=116102{ x=int((NR-3)/129+1); $1=x"MGD" }1' file

测试:

您必须设置起点NR 和除数来定义它。例如对于这个测试文件:

900 mgdg molecules in water t= 953400.00000 step= 635600000
177255
    1BGL     C5    1   4.977  15.059   2.068
    1BGL     H5    2   5.025  15.020   2.158
    1BGL     O5    3   4.881  14.948   2.052
    1BGL     C5    1   4.977  15.059   2.068
    1BGL     H5    2   5.025  15.020   2.158
    1BGL     O5    3   4.881  14.948   2.052
    1BGL     O5    3   4.881  14.948   2.052
    4LIN    HI216099   1.909  19.279   7.886
    4LIN    HI316100   1.849  19.417   7.987 (the last line, which I want to modify
20389SOL    HW177254   0.325   8.307   3.850
20389SOL    HW277255   0.245   8.235   3.957
   5.75588  25.65343  12.14665

每 3 行修改第 3-11 行:

> awk 'NR>=3 && NR<=11{ x=int( (NR-3)/3+1);$1 = x"MGD"}1' file
900 mgdg molecules in water t= 953400.00000 step= 635600000
177255
1MGD C5 1 4.977 15.059 2.068
1MGD H5 2 5.025 15.020 2.158
1MGD O5 3 4.881 14.948 2.052
2MGD C5 1 4.977 15.059 2.068
2MGD H5 2 5.025 15.020 2.158
2MGD O5 3 4.881 14.948 2.052
3MGD O5 3 4.881 14.948 2.052
3MGD HI216099 1.909 19.279 7.886
3MGD HI316100 1.849 19.417 7.987 (the last line, which I want to modify
20389SOL    HW177254   0.325   8.307   3.850
20389SOL    HW277255   0.245   8.235   3.957
   5.75588  25.65343  12.14665

另外,切勿在内部的同一个文件上使用带有awkbash 循环。可以通过一个awk 来完成。

【讨论】:

    猜你喜欢
    • 2020-08-30
    • 2021-01-01
    • 1970-01-01
    • 2020-01-27
    • 2019-01-22
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多