vim:如果为空,则将第二列空白替换为同一列中的值

时间:2016-12-15 15:57:12

标签: bash unix vim awk sed

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

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解决方案。

4 个答案:

答案 0 :(得分:2)

awk救援!

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

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

答案 1 :(得分:1)

这是一个单独的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

答案 2 :(得分:0)

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

<input class="form-control" placeholder="Category name" formControlName="name" required="CATEGORY_REQUIRED" maxlength="10" minlength="3"/> CTRL-V CTRL-N CTRL-V ESC ZZ

说明:

:v/,/norm A,S

我从vimgolf获得了一些想法,这是一个可以发布,播放和讨论日常问题的解决方案的网站。

asciicast

答案 3 :(得分:0)

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

qq2jA,S<C-N><Esc>j.q@qZZ

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

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