2016-12-15 87 views
2

我有一个数据集,看起来像这样:VIM:在同一列中的值替换第二栏空白,如果空

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

+0

文件有多长时间,如果你有一个纯粹的'bash'解决方案,而不是'awk'或'sed',它可以吗? – Inian

+0

该文件约为400行,但对bash解决方案感兴趣。 – 4reel77

回答

2

awk来救援!

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

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

漂亮的作品 – 4reel77

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 
+1

很好的答案以及 – 4reel77

+0

介意打破解决方案? – 4reel77

0

我有只是想出了一个vim解决方案:

:v/,/norm A,SCtrl-vCTRL-NCTRL-VEsc键 ZZ

说明:

: ............. 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解决日常问题。

asciicast