【问题标题】:Replace all lines after a match using sed or awk使用 sed 或 awk 替换匹配后的所有行
【发布时间】:2023-02-02 18:41:13
【问题描述】:

我有以下 txt 文件:

Col1,,Col2,,Col 3,,Session,,Time
Mike,,Rg,,Tx,,32658723,,2:00
,,,,,,,,
,,,,,,23623623,,
,,,,,,,,
Joe,,Tx,,Rg,,47235623,,1:00
,,,,,,,,
Peter,,Un,,Xs,,6523,,1:00
,,,,,,,,
Nick,,Xe,,Lk,,67286734,,3:00
,,,,,,,,
,,,,,,,,
,,,,,,32623,,
,,,,,,,,
Bob Li,,Yh,,Xa,,2362,,3:00
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,323,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
Lin Xu,,Rw,,NB,,1352362,,1:00
,,,,,,,,

此文件中最重要的值是第 7 列中的内容。我想填充第一行正下方的所有空行,该行的第 7 列具有值。保持该值不变。

我一直在尝试一些发送命令,例如:

sed -n '/^,/{g;};h;p'

但它正在替换所有空行,即使它们确实具有预期值。

我希望上面的文件变成这样:

Col1,,Col2,,Col 3,,Session,,Time
Mike,,Rg,,Tx,,32658723,,2:00
Mike,,Rg,,Tx,,32658723,,2:00
Mike,,Rg,,Tx,,23623623,,2:00
Mike,,Rg,,Tx,,23623623,,2:00
Joe,,Tx,,Rg,,47235623,,1:00
Joe,,Tx,,Rg,,47235623,,1:00
Peter,,Un,,Xs,,6523,,1:00
Peter,,Un,,Xs,,6523,,1:00
Nick,,Xe,,Lk,,67286734,,3:00
Nick,,Xe,,Lk,,67286734,,3:00
Nick,,Xe,,Lk,,67286734,,3:00
Nick,,Xe,,Lk,,32623,,3:00
Nick,,Xe,,Lk,,32623,,3:00
Bob Li,,Yh,,Xa,,2362,,3:00
Bob Li,,Yh,,Xa,,2362,,3:00
Bob Li,,Yh,,Xa,,323,,3:00
Bob Li,,Yh,,Xa,,323,,3:00
Bob Li,,Yh,,Xa,,323,,3:00
Bob Li,,Yh,,Xa,,323,,3:00
Bob Li,,Yh,,Xa,,323,,3:00
Lin Xu,,Rw,,NB,,1352362,,1:00
Lin Xu,,Rw,,NB,,1352362,,1:00

【问题讨论】:

    标签: awk sed


    【解决方案1】:

    这可能对你有用(GNU sed):

    sed -E '1b
            /^,{8}$/{g;b}
            /^,{6}S+,,$/{G;s/^,{6}(S+),,
    (([^,]*,){6})[^,]*//}
            h' file
    

    忽略标题行。

    如果该行包含空字段,则将其替换为上一个好的行并中断。

    如果该行包含除第七个以外的所有空字段,则附加最后一个好行并将其第七个字段替换为当前行的第七个字段。

    这条线现在好了,复制一份。

    默认打印所有行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 2013-06-01
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      相关资源
      最近更新 更多