【问题标题】:replacing some fields in a line with the fields in the same columns in the next line将一行中的某些字段替换为下一行相同列中的字​​段
【发布时间】:2015-08-12 22:42:36
【问题描述】:

如何解析以下制表符分隔文件以查看第 5 个字段是否为空,如果为空,请将 c1 替换为 c2,将 d1 替换为 d2。实际文件有大量行,其中一些行的第 5 个字段为空。

a0  b0  c0  d0  e0
a1  b1  c1  d1  e1
a2  b2  c2  d2  
a3  b3  c3  d3  e3

【问题讨论】:

  • 只是为了确认一下,您想在第 5 个字段为空/缺失的行之前更改行吗?
  • @ikegami 除非下一行的第五个字段为空,否则无需更改现有行中的字段。我是 bash 脚本的新手。
  • 保存到新文件?打印?这有点不清楚...
  • @dawg 如果保存到一个新文件中,如何将一个文件中的 c1 和 d1 替换为另一个文件中的 c2 和 d2?

标签: python perl awk sed


【解决方案1】:

一种解决方案是创建一行的前瞻缓冲区。

  1. 读取一行并将其保存为“当前行”。
  2. 虽然要阅读的行数更多,
    1. 读取一行并将其保存为“下一行”。
    2. 如果下一行缺少第五个字段或为空,
      1. 适当修改当前行。
    3. 打印当前行。
    4. 将下一行添加到当前行。
  3. 打印当前行。

【讨论】:

    【解决方案2】:

    给定:

    $ cat so.txt
    a0  b0  c0  d0  e0
    a1  b1  c1  d1  e1
    a2  b2  c2  d2  
    a3  b3  c3  d3  e3
    

    您可以在 Python 中编写过滤器:

    #!/usr/bin/python
    
    import fileinput
    from collections import deque
    d=deque(maxlen=1)
    for line in fileinput.input():
        sp=line.split()
        if len(sp)==4 and d:
            d[-1][2]=sp[2]
            d[-1][3]=sp[3]
        else:   
            if d: print '\t'.join(d[-1])
            d.append(sp)
    else:
        print '\t'.join(d[-1])
    

    由于deque 被指定为最大长度为 1,它在任何给定时间只会在内存中保存 1 行。这意味着这个过滤器在内存中永远不会超过两行。

    然后:

    $ ./so.py so.txt
    a0  b0  c0  d0  e0
    a1  b1  c2  d2  e1
    a3  b3  c3  d3  e3
    

    并将其重定向到所需的文件。

    注意:如果一行中有多行只有四个字段,或者第一行有四个字段,则将不起作用。但是,您没有指定这些结果...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2016-06-12
      • 1970-01-01
      • 2022-01-22
      • 2017-02-18
      • 1970-01-01
      相关资源
      最近更新 更多