2016-07-01 6 views
1

Выходной образец моего файла приведен здесьКак объединить две строки в нужном месте, как будто она вытягивается вверх/вниз, используя AWK или СЭД

! S R Number :   Class :  ! 
       635035    3  
! Name  :       ! 
       ADAM BASHA    
+========================================+ 
! Code ! Description  !  Amount ! 
+========================================+ 
! 2222 ! Tech.Exam Allow !  340.00 ! 
! 3104 ! D A    ! 19,524.43 ! 
! 3107 ! H R A   !  3,984.40 ! 
! 4113 ! Transport Allow !  460.00 ! 
!       :    ! 
    Net Amount Payable :  24,308.83 
! S R Number :   Class :  ! 
       551820    2  
! Name  :       ! 
       TOM SMITH    
+========================================+ 
! Code ! Description  !  Amount ! 
+========================================+ 
! 3104 ! D A    ! 19,404.41 ! 
! 3107 ! H R A   !  3,960.60 ! 
! 4113 ! Transport Allow !  460.00 ! 
!       :    ! 
    Net Amount Payable :  23,825.01 
! S R Number :   Class :  ! 
       550044    3  
! Name  :       ! 
       ROBERT LOUIS   

Я хочу, чтобы каждые две строки, подобные этому формату, приведенному ниже будут объединены

! S R Number :   Class :  ! 
       635035    3 

Я хочу, чтобы эти две линии должны быть объединены следующим образом

! S R Number : 635035  Class : 3 ! 

И весь результат должен быть е olkes:

! S R Number : 635035  Class : 3 ! 
! Name  : ADAM BASHA    ! 
+========================================+ 
! Code ! Description  !  Amount ! 
+========================================+ 
! 2222 ! Tech.Exam Allow !  340.00 ! 
! 3104 ! D A    ! 19,524.43 ! 
! 3107 ! H R A   !  3,984.40 ! 
! 4113 ! Transport Allow !  460.00 ! 
! Net Amount Payable :  24,308.83 ! 
! S R Number : 551820  Class : 2 ! 
! Name  : TOM SMITH    ! 
+========================================+ 
! Code ! Description  !  Amount ! 
+========================================+ 
! 3104 ! D A    ! 19,404.41 ! 
! 3107 ! H R A   !  3,960.60 ! 
! 4113 ! Transport Allow !  460.00 ! 
! Net Amount Payable :  23,825.01 ! 
! S R Number : 550044  Class : 3 ! 
! Name  : ROBERT LOUIS    ! 

Файл слишком большой, поэтому я разместил его образец. Этот выходной файл, по-видимому, разбивает некоторые строки на две строки, например строки, содержащие S R Number, Name and Net Amount Payable. Пожалуйста, предоставьте это решение.

Ответы, которые уже даны, работают нормально, только они обрабатывают все строки, а не только линии, которые разделены. Спасибо всем.

Я отредактировал свой вопрос, используя практический пример.

ответ

3
$ cat tst.awk 
/^[^[:space:]]/ { 
    if (NR>1) { print buf } 
    buf = $0 
    next 
} 
{ 
    if (/:/) { sub(/:/," ",buf) } 
    while (match($0,/[^[:space:]]+/)) { 
     buf = substr(buf,1,RSTART-1) substr($0,RSTART,RLENGTH) substr(buf,RSTART+RLENGTH) 
     $0 = sprintf("%*s",RSTART+RLENGTH-1,"") substr($0,RSTART+RLENGTH) 
    } 
} 
END { print buf } 

.

$ awk -f tst.awk file 
! S R Number : 635035  Class : 3 ! 
! Name  : ADAM BASHA    ! 
+========================================+ 
! Code ! Description  !  Amount ! 
+========================================+ 
! 2222 ! Tech.Exam Allow !  340.00 ! 
! 3104 ! D A    ! 19,524.43 ! 
! 3107 ! H R A   !  3,984.40 ! 
! 4113 ! Transport Allow !  460.00 ! 
! Net Amount Payable :  24,308.83 ! 
! S R Number : 551820  Class : 2 ! 
! Name  : TOM SMITH    ! 
+========================================+ 
! Code ! Description  !  Amount ! 
+========================================+ 
! 3104 ! D A    ! 19,404.41 ! 
! 3107 ! H R A   !  3,960.60 ! 
! 4113 ! Transport Allow !  460.00 ! 
! Net Amount Payable :  23,825.01 ! 
! S R Number : 550044  Class : 3 ! 
! Name  : ROBERT LOUIS    ! 
+1

интересно, что вы не можете сделать с 'awk'? +1 :) – Inian

+1

Это больше того, что ** не должно ** вы делаете :-). awk предназначен для манипулирования текстом. период. полная остановка. Если вы хотите сделать что-то другое, кроме этого (перемещение файлов вокруг процессов убийства?), Вы должны использовать что-то еще (например, shell). –

+0

Все предлагаемые решения отлично работают, но обрабатывают все строки в файле. Мне нужно только объединить две строки: у одного есть ** Имя **, а у другого есть ** фактическое имя **, как в вопросе. У меня много таких случаев в файле. Мне нужно объединить две линии, имеющие эти два шаблона, как указано выше. Спасибо всем за отличные решения. – adam1969in

0

Эта команда (не очень элегантно) должен сделать работу для ввода-файла test:

awk 'BEGIN{odd=1} 
    odd{line=$0;odd=0;next} 
    {odd=1;nline="" 
     for(i=1; i<=length($0);i++){ 
      nline=substr($0,i,1)==" " && i <= length(line)? nline""substr(line,i,1) : nline""substr($0,i,1) 
     } 
    print nline 
    }' test 

Выход:

Name : Adam Basha      Class : 3 
+0

'odd' можно написать как' NR% 2' – karakfa

1

еще gawk решение с использованием одного символьных длинами полого

$ awk 'BEGIN{OFS=FS=""} 
      {if(NR%2) split($0,p); 
      else {for(i=1;i<=NF;i++) if($i==" ") $i=p[i]; 
        print}}' file 

Name : Adam Basha      Class :3 

здесь предполагается, вторая запись длиннее первой записи (если не изменить цикл граничного условия макс длины (р) и NF или добавить массовка после

+1

Какова аргументация за тобой? – hek2mgl

+0

лучше? Намерением отступов является 'condition {action}' блоков, выровненных по действию, операторов одинакового уровня с одинаковым отступом уровня. Если он течет в строке и короткий (например, 'if (x) y' держится на одной строке. У меня нет красивого принтера, а иногда и ошибки ... – karakfa

+0

http://pastebin.com/TSb9kitU Надеюсь Это помогает. И, кстати, у меня тоже нет красивого принтера. Я красивый принтер;) – hek2mgl

0

Это может работать для вас (GNU SED):.

sed -r 'N;/\n\s/!{P;D};s/^/\n/;ta;:a;/\n.*\n$/s/\n//g;t;s/\n\n/\n \n/;s/\n(\S)(.*)\n./\1\n\2\n/;ta;s/\n.(.*)\n(.)/\2\n\1\n/;ta' file 

Процесс объединяет требуемые строки и использует уникальные маркеры (новые строки), перемещающиеся слева направо, сравнивая одиночные символы, следующие за маркером. Если первое не пространство, держите его и продвигайте над ним маркеры. В противном случае замените первую на вторую и продвиньте маркеры над ней. Если маркеры достигли конца строки, удалите маркеры, кроме тех случаев, когда первая строка короче второй, когда в первой строке добавлено дополнительное пространство.

 Смежные вопросы

  • Нет связанных вопросов^_^