Объединение нескольких строк после сопоставления с шаблоном

En la salida ps aux, hay una columna que especifica STAT, en su lista debe haber un proceso con RSTAT, este es el proceso que se ejecuta en la CPU

1
20.06.2019, 16:23
5 ответов

в awk нельзя читать вперед, нужно запоминать шаблон

файл awk (u.awk ниже)

/STUDENT/ { li=NR;}
NR == li+2 { mark[li]=$0 }
NR == li+4 { pos[li]=$0 }
END { for (m in mark) printf "%s %s\n",mark[m],pos[m] ;}

где

  • /STUDENT/ { li=NR;}запомнить строку начала записи
  • NR == li+2 { mark[li]=$0 }когда текущая строка равна +2, запомните отметку (аналогично для позиции)

при запуске с вашими образцами данных (я удаляю пустые строки, корректирую +2/+4, если они присутствуют в реальном файле ), это дает

awk -f u.awk liste-1.txt

XYZ 20 I 5 TTT ANON B
ABC              40                I 5 TTT ANON A

Генерация заголовка опущена.

0
27.01.2020, 23:41

Если вы предварительно -разбили данные на записи, можно обойтись печатью соответствующих полей:

# Pre-splitting
sed '/^STUDENT/ { 1!s/^/\n/; }' infile |

# Reorder the record:
awk -v RS= -v FS='\n' '
  NR == 1 { print $2, $4, $6 }
          { print $3, $5, $7 }'        |

# Pretty-print columns
column -t

Выход:

NAME  MARKS  STD  RANK  SCHOOL  TEACHER  GRADE  POSITION
XYZ   20     I    5     TTT     ANON     B      5
ABC   40     I    5     TTT     ANON     A      5
0
27.01.2020, 23:41
awk '
    BEGIN { OFS="\t"; maxLines=7 }
    { lineNr=(NR-1) % maxLines + 1; $1=$1; lines[lineNr]=$0 }
    NR == maxLines     { print lines[2], lines[4], lines[6] }
    lineNr == maxLines { print lines[3], lines[5], lines[7] }
' file
NAME    MARKS   STD     RANK    SCHOOL  TEACHER GRADE   POSITION
XYZ     20      I       5       TTT     ANON    B       5
ABC     40      I       5       TTT     ANON    A       5
1
27.01.2020, 23:41

Включены конструкции Gnu sed и расширенный режим регулярных выражений:

 $ sed -nEe '
      1,6{
         N;7!s/^/\n/;7!D;h





  s/(.*)\n(.*)\n(.*)\n(.*)\n(.*)\n(.*)\n(.*)/\2\t\4\t\6/p
         ba
     }
    /STUDENT/!{H;$!d;:a;g;}

      s/(.*)\n(.*)\n(.*)\n(.*)\n(.*)\n(.*)\n(.*)/\3\t\5\t\7/p
 ' file.txt


 NAME   MARKS   STD RANK    SCHOOL  TEACHER GRADE   POSITION
 XYZ    20  I   5   TTT ANON    B   5
 ABC    40  I   5   TTT ANON    A   5
0
27.01.2020, 23:41
Tested with below script and it worked fine


STEP1:

header=`sed '/STUDENT/d' r.txt |sed -n '1~2p'| sort | uniq| sed "N;s/\n/ /g"| sed "N;s/\n/ /g"`

count=`sed '/STUDENT/d'  o.txt|wc -l`
sed -i '/STUDENT/d' o.txt

STEP2:
for ((i=1;i<=$count;i++)); do j=$(($i+5)); sed -n ""$i","$j"p" o.txt| sed -n '2~2p'|sed -r "s/\s+/ /g"|sed "N;s/\n/ /g"|sed "N;s/\n/ /g"; i=$j; done| awk -v header="$header" 'BEGIN{print header}{print $0}'| sed "s/ /\t/g"
0
27.01.2020, 23:41

Теги

Похожие вопросы