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
Où ,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.
Je viens de faire le challenge vimgolf, puis j’ai trouvé la question … J’ai mis ma solution (16 frappes au clavier) ici:
qq2jA,S
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é.