2016-12-15 1 views
2

У меня есть набор данных, который выглядит следующим образом:ВИМ: заменить 2-ой заготовки столбцов со значениями в той же колонке, если пустой

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, если 2-й столбец пуст. Замена происходит только в том случае, если 2-й столбец пуст и должен заменить до нечетной строки. Будет рассматривать решение 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-нCtrl-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, сайт, где вы можете оставить, играть и обсудить ВИМ решения повседневных проблем ,

asciicast

0

Я только что сделал vimgolf вызов, то нашел вопрос ... Я положил мое решение (16 нажатий клавиш) здесь:

qq2jA,S<C-N><Esc>[email protected]

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

Обратите внимание, что , приведенная выше строка работает только для примера. если файл находится в том же формате, вы можете повторно воспроизвести макрос больше раз после его записи.