【问题标题】:vim: replace 2nd column blanks with values in same column if blankvim:如果空白,则用同一列中的值替换第二列空白
【发布时间】:2017-05-01 07:12:13
【问题描述】:

我有一个如下所示的数据集:

TEST,SOMELOG
TESA,SOMELOGA
TESB
TESC
TESD,SOMELOGB
TESE
TESF
TESG,SOMELOGC

需要让它看起来像这样:

TEST,SOMELOG
TESA,SOMELOGA
TESB,SOMELOGB
TESC,SOMELOGB
TESD,SOMELOGB
TESE,SOMELOGC
TESF,SOMELOGC
TESG,SOMELOGC

如果第二列为空白,,SOMELOGB,SOMELOGC 将替换每个 /r 回车符。仅当第二列为空白时才会发生替换,并且应该替换到非空白行。会考虑使用 bash /sed/awk 或 vim 解决方案。

【问题讨论】:

  • 文件多长,如果你有纯bash解决方案,而不是awksed,可以吗?
  • 该文件大约有 400 行,但我对 bash 解决方案感兴趣。

标签: bash unix vim awk sed


【解决方案1】:

awk 来救援!

如果你有tac,这可能是最简单的

$ tac file | awk -F, -v OFS=, 'NF==1{$2=p} NF>1{p=$2}1' | tac

【讨论】:

    【解决方案2】:

    这是一个单一的 awk 解决方案(当文件很大并且双重 tac 很昂贵时特别方便):

    awk -F, 'NF==1{a=a $0 RS; next} a!=""{gsub(RS, FS $2 RS, a); printf "%s", a; a=""} 1' file
    
    TEST,SOMELOG
    TESA,SOMELOGA
    TESB,SOMELOGB
    TESC,SOMELOGB
    TESD,SOMELOGB
    TESE,SOMELOGC
    TESF,SOMELOGC
    TESG,SOMELOGC
    

    【讨论】:

    • 很好的答案
    【解决方案3】:

    我刚刚想出了一个vim的解决方案:

    :v/,/norm A,SCtrl-vCtrl-nCtrl-vEscZZ

    解释:

    : ............. command mode
    : v/,/ ........ match lines that not have ','
    norm .......... normal mode
    A ............. append text at the end of line
    , ............. literal ','
    S ............. inserts the first letter to use completion after
    <Ctrl-v> ...... used to insert literal keyboard shortcuts
    <Ctrl-n> ...... complete with the first completion option of vim
    Esc ........... used to exit insert mode
    ZZ ............ fast way to save and exit an existing file
    

    我从vimgolf 获得的一些想法,您可以在该网站上发布、播放和讨论针对日常问题的 vim 解决方案。

    【讨论】:

      【解决方案4】:

      我刚刚完成了 vimgolf 挑战,然后找到了问题...我把我的解决方案(16 次击键)放在这里:

      qq2jA,S&lt;C-N&gt;&lt;Esc&gt;j.q@qZZ

      http://www.vimgolf.com/challenges/5853f052854f48716101cc70

      请注意,上面的行仅适用于示例。如果文件格式相同,可以在录制后多次重播宏。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        相关资源
        最近更新 更多