【问题标题】:Increment every 33 line of 6 column by 1 [closed]每 6 列的 33 行增加 1 [关闭]
【发布时间】:2015-08-10 18:15:37
【问题描述】:

我有以下类型的文件,

ATOM      4  C4  UNK X   1       7.747   4.310   5.563  1.00  0.00           C
ATOM      5  C5  UNK X   1       8.900   3.705   6.021  1.00  0.00           C
ATOM      6  C6  UNK X   1       9.622   2.872   5.185  1.00  0.00           C

-- 最多 3564 行。

我想每 33 行将第六列增加 1。我看过之前的帖子,找到了这段代码,

gawk -v n=1 '
match($0,/^(.{22})....(.*)/, f) {printf "%s%4d%s\n", f[1], n, f[2]}
NR % 20 == 0 {n++}
{print}
' file

上述文件的输出是:

ATOM   3556  H10 UNK X 178      30.121  19.518  46.272  1.00  0.00           H
ATOM   3556  H10 UNK X   1      30.121  19.518  46.272  1.00  0.00           H

能否建议我,如何每 33 行增加第六列?

【问题讨论】:

  • 您包含的代码似乎与您要执行的操作无关!此外,看起来输入和输出并没有真正匹配。
  • edit您的问题,以便输入和输出匹配。您可能只需要一个非常简单的 awk 命令,但在您把问题弄得更清楚之前,我们不可能知道。无论如何,你坚持哪一部分?
  • 不是发布 3 行输入,而是告诉我们您希望每 33 行递增一次并且不显示任何预期的输出 - 显示,比如说,10 行输入并询问我们如何每 3 行递增一次,显示所需的输出。

标签: python shell awk


【解决方案1】:

这可能就足够了:

awk '{$6=int(NR/33)+1}1' input.txt

这会将字段 6 替换为基于行号的整数。表情有点明显。 +1 之所以存在,是因为,例如,在第 21 行,NR/33=0.6363,int() 被截断为零。

“脚本”末尾的 1 会打印该行,因为它的计算结果为“true”,而在 awk 中,缺少的语句默认为 {print}

请注意,在 awk 中,每当您更改字段数据时,awk 都会重新处理该行以减少空格,将所有字段分隔符替换为 OFS

【讨论】:

  • 谢谢大家的回复。代码运行良好。
【解决方案2】:

如果您只想增加第 (33*n) 行,您可以这样做。

awk '!(NR%33){$6+=++p} 1'

第 33 行将增加 1,第 66 行将增加 2,等等。

【讨论】:

    【解决方案3】:

    这可能是您想要的,但没有可测试的样本输入和预期输出,我们只是猜测:

    awk '{$6+=val; print} !(NR%33){++val}' file
    

    例如:

    $ cat file
    ATOM      4  C4  UNK X   1       7.747   4.310   5.563  1.00  0.00           C
    ATOM      5  C5  UNK X   1       8.900   3.705   6.021  1.00  0.00           C
    ATOM      6  C6  UNK X   1       9.622   2.872   5.185  1.00  0.00           C
    ATOM      4  C4  UNK X   1       7.747   4.310   5.563  1.00  0.00           C
    ATOM      5  C5  UNK X   1       8.900   3.705   6.021  1.00  0.00           C
    ATOM      6  C6  UNK X   1       9.622   2.872   5.185  1.00  0.00           C
    ATOM      4  C4  UNK X   1       7.747   4.310   5.563  1.00  0.00           C
    ATOM      5  C5  UNK X   1       8.900   3.705   6.021  1.00  0.00           C
    ATOM      6  C6  UNK X   1       9.622   2.872   5.185  1.00  0.00           C
    ATOM      4  C4  UNK X   1       7.747   4.310   5.563  1.00  0.00           C
    
    $ awk '{$6+=val; print} !(NR%3){++val}' file
    ATOM 4 C4 UNK X 1 7.747 4.310 5.563 1.00 0.00 C
    ATOM 5 C5 UNK X 1 8.900 3.705 6.021 1.00 0.00 C
    ATOM 6 C6 UNK X 1 9.622 2.872 5.185 1.00 0.00 C
    ATOM 4 C4 UNK X 2 7.747 4.310 5.563 1.00 0.00 C
    ATOM 5 C5 UNK X 2 8.900 3.705 6.021 1.00 0.00 C
    ATOM 6 C6 UNK X 2 9.622 2.872 5.185 1.00 0.00 C
    ATOM 4 C4 UNK X 3 7.747 4.310 5.563 1.00 0.00 C
    ATOM 5 C5 UNK X 3 8.900 3.705 6.021 1.00 0.00 C
    ATOM 6 C6 UNK X 3 9.622 2.872 5.185 1.00 0.00 C
    ATOM 4 C4 UNK X 4 7.747 4.310 5.563 1.00 0.00 C
    

    【讨论】:

      【解决方案4】:

      我会给你 Python 代码,安装 Python 3.4 以运行它。

      import shutil
      import os
      with open("full_path_to_file", "r") as f, open("a.csv", "a") as w:
          count = 2
          l = next(f)
          l = l.split(",")
          l = str(int(l[5]) + 1)
          w.append(','.join(l))
          for line in f:
              if count % 33 != 0 or count <= 33:
                  count += 1
                  w.write(line)
              line = line.split(",")
              line[5] = str(int(line[5]) + 1)
              w.write(','.join(line))
             count += 1
          shutil.move(w.name, f.name)
          os.remove(w.name)
      

      【讨论】:

      • 你测试你的代码了吗?为什么你导入csv 广告你没有使用它?条件将仅匹配 33 第一行和行 % 33 因此例如您将编辑行号 54?并且 OP 没有要求这样做?
      • 我不会编辑54。我编辑了帖子,忘记取出 csv,抱歉。并且 OP 想要每 33 行,我可以使用 next(file) 来获取第一行并解析它,我现在将这样做。我
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 2021-02-05
      • 1970-01-01
      • 2016-08-11
      • 2021-10-23
      • 1970-01-01
      相关资源
      最近更新 更多