vim: remplace les espaces vides de la deuxième colonne par des valeurs dans la même colonne s’ils sont vides

J’ai un dataset qui ressemble à ceci:

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

Besoin de le faire ressembler à ceci:

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

,SOMELOGB et ,SOMELOGC remplacent chaque retour chariot si la deuxième colonne est vide. Le remplacement ne se produit que si la 2ème colonne est vide et doit être remplacée par la ligne non vide. Considérerait une solution bash / sed / awk ou vim.

awk à la rescousse!

si vous avez tac , cela pourrait être le plus facile

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

Voici une solution awk unique (particulièrement pratique lorsque le fichier est volumineux et que le double tac coûte cher):

 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 

Je viens de trouver une solution vim:

:v/,/norm A,S Ctrl-v Ctrl-n Ctrl-v Esc ZZ

Explication:

 : ............. 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  ...... used to insert literal keyboard shortcuts  ...... complete with the first completion option of vim Esc ........... used to exit insert mode ZZ ............ fast way to save and exit an existing file 

Quelques idées que j’ai tirées de vimgolf , un site où vous pouvez poster, jouer et discuter des solutions vim aux problèmes quotidiens.

asciicast

Je viens de faire le challenge vimgolf, puis j’ai trouvé la question … J’ai mis ma solution (16 frappes au clavier) ici:

qq2jA,Sjq@qZZ

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

Notez que la ligne ci-dessus ne fonctionne que pour l’exemple. Si le fichier est au même format, vous pouvez relire la macro plusieurs fois après l’avoir enregistré.