6列中每33行增加1

2024-09-27 09:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下类型的文件

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行增加第六栏吗?你知道吗


Tags: 文件代码类型matchnr帖子atomprint
3条回答

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

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

第33行将增加1,第66行将增加2,以此类推

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

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

这就足够了:

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

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

“script”末尾的尾随1打印该行,因为它的计算结果为“true”,在awk中,缺少的语句默认为{print}。你知道吗

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

相关问题 更多 >

    热门问题