搜索匹配项,然后将该匹配项后的值替换为前一行中的值

a

我有多个文件,其中包含以下模式的数千行:

O   HOH     1      11.700 -11.906   1.533
H   HOH     0      12.561 -12.318   1.596
H   HOH     0      11.445 -12.031   0.627
O   HOH     2      17.897   8.999  -0.104
H   HOH     0      18.444   8.521   0.516
H   HOH     0      17.127   8.457  -0.223
O   HOH     3      -0.688  10.310 -15.189
H   HOH     0      -0.760   9.366 -15.055
H   HOH     0      -0.494  10.665 -14.324
O   HOH     4     -10.418   3.733   4.069
H   HOH     0      -9.928   3.726   4.897
H   HOH     0     -11.222   4.218   4.268
O   HOH     5       2.655  -8.910  13.338
H   HOH     0       2.377  -9.739  13.737
H   HOH     0       1.847  -8.531  12.992
O   HOH     6      -0.191  -1.010 -19.469
H   HOH     0       0.455  -1.460 -18.924
H   HOH     0      -0.571  -0.343 -18.895
O   HOH     7      14.338 -15.985  -1.467
H   HOH     0      15.129 -15.647  -1.886
H   HOH     0      13.854 -16.408  -2.175
O   HOH     8     -15.510  -7.073   1.857
H   HOH     0     -15.526  -6.116   1.874
H   HOH     0     -16.341  -7.321   1.464
O   HOH     9       9.155   6.561  -7.729
H   HOH     0       9.419   7.335  -7.245
H   HOH     0       9.943   6.018  -7.768
.
.
.
.
O   HOH  999999     9.155   6.561  -7.729
H   HOH     0       9.419   7.335  -7.245
H   HOH     0       9.943   6.018  -7.768

我需要的是更换的各2个连续的时刻'H HOH 0''H HOH xxx'地方xxx是0以上的权值

我尝试过的是,我使用以下命令将大文件拆分为3行文件

split -l 3 foo

然后使用awk将所需的值复制到另一个文件

awk 'NR==1 print $3' > foo--

然后尝试通过读取文件foo--并使用sed替换模式来替换foo中的“ 0”

sed -e '/  0  /{r foo--' -e 'd}' foo 

但这没用

非常确定有更好的方法可以做到这一点

最终结果应如下所示:

O   HOH     1      11.700 -11.906   1.533
H   HOH     1      12.561 -12.318   1.596
H   HOH     1      11.445 -12.031   0.627
O   HOH     2      17.897   8.999  -0.104
H   HOH     2      18.444   8.521   0.516
H   HOH     2      17.127   8.457  -0.223
O   HOH     3      -0.688  10.310 -15.189
H   HOH     3      -0.760   9.366 -15.055
H   HOH     3      -0.494  10.665 -14.324
O   HOH     4     -10.418   3.733   4.069
H   HOH     4      -9.928   3.726   4.897
H   HOH     4     -11.222   4.218   4.268
O   HOH     5       2.655  -8.910  13.338
H   HOH     5       2.377  -9.739  13.737
H   HOH     5       1.847  -8.531  12.992
O   HOH     6      -0.191  -1.010 -19.469
H   HOH     6       0.455  -1.460 -18.924
H   HOH     6      -0.571  -0.343 -18.895
.
.
.
O   HOH     99999      -0.191  -1.010 -19.469
H   HOH     99999       0.455  -1.460 -18.924
H   HOH     99999      -0.571  -0.343 -18.895
埃德·莫顿

如果您不关心字段之间的间距,则只获取所需的值:

$ awk '$1=="H"{$3=p} {p=$3} 1' file
O   HOH     1      11.700 -11.906   1.533
H HOH 1 12.561 -12.318 1.596
H HOH 1 11.445 -12.031 0.627
O   HOH     2      17.897   8.999  -0.104
H HOH 2 18.444 8.521 0.516
H HOH 2 17.127 8.457 -0.223
O   HOH     3      -0.688  10.310 -15.189
H HOH 3 -0.760 9.366 -15.055
H HOH 3 -0.494 10.665 -14.324
O   HOH     4     -10.418   3.733   4.069
H HOH 4 -9.928 3.726 4.897
H HOH 4 -11.222 4.218 4.268
O   HOH     5       2.655  -8.910  13.338
H HOH 5 2.377 -9.739 13.737
H HOH 5 1.847 -8.531 12.992
O   HOH     6      -0.191  -1.010 -19.469
H HOH 6 0.455 -1.460 -18.924
H HOH 6 -0.571 -0.343 -18.895
O   HOH     7      14.338 -15.985  -1.467
H HOH 7 15.129 -15.647 -1.886
H HOH 7 13.854 -16.408 -2.175
O   HOH     8     -15.510  -7.073   1.857
H HOH 8 -15.526 -6.116 1.874
H HOH 8 -16.341 -7.321 1.464
O   HOH     9       9.155   6.561  -7.729
H HOH 9 9.419 7.335 -7.245
H HOH 9 9.943 6.018 -7.768
O   HOH  999999     9.155   6.561  -7.729
H HOH 999999 9.419 7.335 -7.245
H HOH 999999 9.943 6.018 -7.768

或以空格分隔,最后4个字段右对齐:

$ awk '$1=="H"{$3=p} {p=$3} 1' file | column -t -R3,4,5,6
O  HOH       1   11.700  -11.906    1.533
H  HOH       1   12.561  -12.318    1.596
H  HOH       1   11.445  -12.031    0.627
O  HOH       2   17.897    8.999   -0.104
H  HOH       2   18.444    8.521    0.516
H  HOH       2   17.127    8.457   -0.223
O  HOH       3   -0.688   10.310  -15.189
H  HOH       3   -0.760    9.366  -15.055
H  HOH       3   -0.494   10.665  -14.324
O  HOH       4  -10.418    3.733    4.069
H  HOH       4   -9.928    3.726    4.897
H  HOH       4  -11.222    4.218    4.268
O  HOH       5    2.655   -8.910   13.338
H  HOH       5    2.377   -9.739   13.737
H  HOH       5    1.847   -8.531   12.992
O  HOH       6   -0.191   -1.010  -19.469
H  HOH       6    0.455   -1.460  -18.924
H  HOH       6   -0.571   -0.343  -18.895
O  HOH       7   14.338  -15.985   -1.467
H  HOH       7   15.129  -15.647   -1.886
H  HOH       7   13.854  -16.408   -2.175
O  HOH       8  -15.510   -7.073    1.857
H  HOH       8  -15.526   -6.116    1.874
H  HOH       8  -16.341   -7.321    1.464
O  HOH       9    9.155    6.561   -7.729
H  HOH       9    9.419    7.335   -7.245
H  HOH       9    9.943    6.018   -7.768
O  HOH  999999    9.155    6.561   -7.729
H  HOH  999999    9.419    7.335   -7.245
H  HOH  999999    9.943    6.018   -7.768

或TSV格式:

$ awk -v OFS='\t' '{$3=($1=="H" ? p : $3); p=$3} 1' file
O       HOH     1       11.700  -11.906 1.533
H       HOH     1       12.561  -12.318 1.596
H       HOH     1       11.445  -12.031 0.627
O       HOH     2       17.897  8.999   -0.104
H       HOH     2       18.444  8.521   0.516
H       HOH     2       17.127  8.457   -0.223
O       HOH     3       -0.688  10.310  -15.189
H       HOH     3       -0.760  9.366   -15.055
H       HOH     3       -0.494  10.665  -14.324
O       HOH     4       -10.418 3.733   4.069
H       HOH     4       -9.928  3.726   4.897
H       HOH     4       -11.222 4.218   4.268
O       HOH     5       2.655   -8.910  13.338
H       HOH     5       2.377   -9.739  13.737
H       HOH     5       1.847   -8.531  12.992
O       HOH     6       -0.191  -1.010  -19.469
H       HOH     6       0.455   -1.460  -18.924
H       HOH     6       -0.571  -0.343  -18.895
O       HOH     7       14.338  -15.985 -1.467
H       HOH     7       15.129  -15.647 -1.886
H       HOH     7       13.854  -16.408 -2.175
O       HOH     8       -15.510 -7.073  1.857
H       HOH     8       -15.526 -6.116  1.874
H       HOH     8       -16.341 -7.321  1.464
O       HOH     9       9.155   6.561   -7.729
H       HOH     9       9.419   7.335   -7.245
H       HOH     9       9.943   6.018   -7.768
O       HOH     999999  9.155   6.561   -7.729
H       HOH     999999  9.419   7.335   -7.245
H       HOH     999999  9.943   6.018   -7.768

但是,如果您需要保留原始间距,则使用GNU awk的第四个参数split()可以保留您开始时使用的任何间距:

$ cat tst.awk
{
    if ($1 == "H") {
        split(prev,pflds,FS,pseps)
        n = split($0,flds,FS,seps)
        seps[2] = pseps[2]
        flds[3] = pflds[3]
        seps[3] = sprintf("%*s",length(pseps[3]) + length(pflds[4]) - length(flds[4]),"")
        $0 = ""
        for (i=1; i<=n; i++) {
            $0 = $0 flds[i] seps[i]
        }
    }
    print
    prev = $0
}

$ awk -f tst.awk file
O   HOH     1      11.700 -11.906   1.533
H   HOH     1      12.561 -12.318   1.596
H   HOH     1      11.445 -12.031   0.627
O   HOH     2      17.897   8.999  -0.104
H   HOH     2      18.444   8.521   0.516
H   HOH     2      17.127   8.457  -0.223
O   HOH     3      -0.688  10.310 -15.189
H   HOH     3      -0.760   9.366 -15.055
H   HOH     3      -0.494  10.665 -14.324
O   HOH     4     -10.418   3.733   4.069
H   HOH     4      -9.928   3.726   4.897
H   HOH     4     -11.222   4.218   4.268
O   HOH     5       2.655  -8.910  13.338
H   HOH     5       2.377  -9.739  13.737
H   HOH     5       1.847  -8.531  12.992
O   HOH     6      -0.191  -1.010 -19.469
H   HOH     6       0.455  -1.460 -18.924
H   HOH     6      -0.571  -0.343 -18.895
O   HOH     7      14.338 -15.985  -1.467
H   HOH     7      15.129 -15.647  -1.886
H   HOH     7      13.854 -16.408  -2.175
O   HOH     8     -15.510  -7.073   1.857
H   HOH     8     -15.526  -6.116   1.874
H   HOH     8     -16.341  -7.321   1.464
O   HOH     9       9.155   6.561  -7.729
H   HOH     9       9.419   7.335  -7.245
H   HOH     9       9.943   6.018  -7.768
O   HOH  999999     9.155   6.561  -7.729
H   HOH  999999     9.419   7.335  -7.245
H   HOH  999999     9.943   6.018  -7.768

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在数组中搜索值匹配项并替换值-php

来自分类Dev

搜索数组以查找值匹配项并替换值-php

来自分类Dev

如何计算字典值中的标记并将每个匹配项替换为列表中的项

来自分类Dev

给定数量的匹配项后的行替换为AWK

来自分类Dev

从2个范围中查找匹配项并将匹配项替换为特定值,是否有优化的方法?

来自分类Dev

将列中的值替换为与具有匹配项的vector对应的值

来自分类Dev

在PHP中找到匹配项后获得一行

来自分类Dev

使用第一行作为参考替换所有行中的特定字符匹配项

来自分类Dev

在数据框行中查找值-创建新列以突出显示下一行匹配项

来自分类Dev

将字符串中的所有匹配项替换为哈希表中的值

来自分类Dev

在R中,根据相邻列中字符的匹配项将值替换为NA

来自分类Dev

将字符串中的所有匹配项替换为哈希表中的值

来自分类Dev

在Pandas系列中搜索值列表并屏蔽匹配项

来自分类Dev

用散列值替换文件中的匹配项

来自分类Dev

对于搜索所在的每一行,打印“找到匹配项”;如果整个文件中没有搜索到,则打印“找不到匹配项”

来自分类Dev

sed在一行中打印多个匹配项

来自分类Dev

findstr在一行中显示匹配项

来自分类Dev

仅在找到匹配项的行中替换

来自分类Dev

如何在vim中搜索值,然后使用该值在同一行中进行搜索和替换?

来自分类Dev

Google表格如何使用单元格值,在另一个标签中进行搜索,找到匹配项后,抓取所有行?

来自分类Dev

根据匹配项更改列中的值

来自分类Dev

将值与值向量进行比较,然后在Matlab中返回匹配项

来自分类Dev

用grep匹配一行中的所有匹配项

来自分类Dev

一行中的所有匹配项:Spacy匹配器

来自分类Dev

搜索每一行,粘贴每个匹配项-Excel VBA

来自分类Dev

根据一行中的值删除重复项

来自分类Dev

如何输出包含匹配项和前一行的行?

来自分类Dev

SQL在一行中选择具有重复值的不同行,然后根据主键字段中的值为每个重复项选择一行

来自分类Dev

如果当前行值与Power Bi中的前一行值匹配,如何找到当前行值?

Related 相关文章

  1. 1

    在数组中搜索值匹配项并替换值-php

  2. 2

    搜索数组以查找值匹配项并替换值-php

  3. 3

    如何计算字典值中的标记并将每个匹配项替换为列表中的项

  4. 4

    给定数量的匹配项后的行替换为AWK

  5. 5

    从2个范围中查找匹配项并将匹配项替换为特定值,是否有优化的方法?

  6. 6

    将列中的值替换为与具有匹配项的vector对应的值

  7. 7

    在PHP中找到匹配项后获得一行

  8. 8

    使用第一行作为参考替换所有行中的特定字符匹配项

  9. 9

    在数据框行中查找值-创建新列以突出显示下一行匹配项

  10. 10

    将字符串中的所有匹配项替换为哈希表中的值

  11. 11

    在R中,根据相邻列中字符的匹配项将值替换为NA

  12. 12

    将字符串中的所有匹配项替换为哈希表中的值

  13. 13

    在Pandas系列中搜索值列表并屏蔽匹配项

  14. 14

    用散列值替换文件中的匹配项

  15. 15

    对于搜索所在的每一行,打印“找到匹配项”;如果整个文件中没有搜索到,则打印“找不到匹配项”

  16. 16

    sed在一行中打印多个匹配项

  17. 17

    findstr在一行中显示匹配项

  18. 18

    仅在找到匹配项的行中替换

  19. 19

    如何在vim中搜索值,然后使用该值在同一行中进行搜索和替换?

  20. 20

    Google表格如何使用单元格值,在另一个标签中进行搜索,找到匹配项后,抓取所有行?

  21. 21

    根据匹配项更改列中的值

  22. 22

    将值与值向量进行比较,然后在Matlab中返回匹配项

  23. 23

    用grep匹配一行中的所有匹配项

  24. 24

    一行中的所有匹配项:Spacy匹配器

  25. 25

    搜索每一行,粘贴每个匹配项-Excel VBA

  26. 26

    根据一行中的值删除重复项

  27. 27

    如何输出包含匹配项和前一行的行?

  28. 28

    SQL在一行中选择具有重复值的不同行,然后根据主键字段中的值为每个重复项选择一行

  29. 29

    如果当前行值与Power Bi中的前一行值匹配,如何找到当前行值?

热门标签

归档