2016-12-15 36 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