2016-06-02 4 views
1

У меня массивный (100M строк) файл, который мне нужно отредактировать на linux перед загрузкой в ​​нашу БД. Это труба разделителями файл и имеет следующий формат в данный момент:Замена условной строки в Linux

a|b|c|d 
e|f|g|h 
    ijkl 
    mn 
o|p|q|r 
s|t|u|v 

Я хотел бы изменить этот формат:

a|b|c|d 
e|f|g|h ijkl mn 
o|p|q|r 
s|t|u|v 

я пытался к нему с использованием Regex и grep/sed/tr, но я новичок в оболочке и невероятно застрял.

Есть ли у кого-нибудь предложения? Спасибо, спасибо.

ответ

0

Это AWK один лайнер работает для данного примера:

awk -F'|' '{printf "%s%s", (NF==4&&NR>1?RS:""),$0}END{print ""}' file 

Если мы протестируем:

kent$ cat f 
a|b|c|d 
e|f|g|h 
    ijkl 
    mn 
o|p|q|r 
s|t|u|v 

kent$ awk -F'|' '{printf "%s%s", (NF==4&&NR>1?RS:""),$0}END{print ""}' f 
a|b|c|d 
e|f|g|h ijkl mn 
o|p|q|r 
s|t|u|v 
0

Вы просто должны добавить к предыдущей линии, если тока линии имеет меньше ожидаемого числа полей:

awk -F '|' -v n=4 ' 
    NF != n {prev = prev $0; next} 
    prev {print prev} 
    {prev = $0} 
    END {print prev} 
' file 
a|b|c|d 
e|f|g|h ijkl mn 
o|p|q|r 
s|t|u|v 

Альтернативный способ смотреть на него, чтобы полностью изменить файл и помните, материал, который не имеет нужного количества полей:

tac file | 
awk -F'|' -v n=4 'NF != n {s = $0 " " s; next} {print $0, s; s = ""}' | 
tac 
Смежные вопросы