Журнал awk с несколькими полями - разделить и пересортировать - PullRequest
0 голосов
/ 03 июля 2018

У меня есть файл

input.txt

ID04120;2017-12-27;Office One;2017-12-27;Merchan Dep;2017-12-27;Sales Team 1;2017-12-27;Merchan Dep;2017-12-28;XXX4615;2017-12-28;XXX4615;2018-03-06;Office One;2018-03-06;Office One
ID04123;2017-12-28;Office One;2017-12-28;XXX4616;2018-04-05;Office One
ID04130;2017-12-29;Office One;2017-12-29;Room Fabric;2017-12-29;Support;2017-12-29;XXX4497;2018-01-17;Office One;2018-01-17;XXX4497;2018-01-17;Sales Team 3;2018-01-17;XXX4497;2018-03-13;Dev-sales-id;2018-03-14;XXX4497;2018-03-16;Dev Fabric
ID04266;2018-01-13;Office One;2018-01-13;XXX4186;2018-02-20;XXX4186;2018-02-22;XXX4186;2018-03-01;Office One

Мой журнал имеет разные номера полей, может иметь 7 или более полей, не является константой, разделенной знаком ";"

как в примере, где я могу иметь 7,11,17 или 23 поля

Мне нужно получить первую запись XXX [0-9] {4} и ее дату (предыдущее поле), а также какой сектор компании был до него и упорядочить их в конце строки.

запись XXX [0-9] {4} и ее дата (предыдущее поле) и другие ее записи XXX [0-9] {4} и их даты (предыдущее поле) не нужны, если мне нужно вырезать .

Ex:

от
ID04123; 2017-12-28; Office One; 2017-12-28; XXX4616 ; 2018-04-05; Office One

до
ID04123; 2017-12-28; Office One; 2018-04-05; Office One; 2017-12-28; Office One; XXX4616

вывод будет выглядеть так:

ID04120;2017-12-27;Office One;2017-12-27;Merchan Dep;2017-12-27;Sales Team 1;2017-12-27;Merchan Dep;2018-03-06;Office One;2018-03-06;Office One;2017-12-28;Merchan Dep;XXX4615
ID04123;2017-12-28;Office One;2018-04-05;Office One;2017-12-28;Office One;XXX4616
ID04130;2017-12-29;Office One;2017-12-29;Room Fabric;2017-12-29;Support;2018-01-17;Office One;2018-01-17;Sales Team 3;2018-03-13;Dev-sales-id;2018-03-16;Dev Fabric;2017-12-29;Support;XXX4497
ID04266;2018-01-13;Office One;2018-03-01;Office One;2018-01-13;Office One;XXX4186

я могу попробовать

awk --re-interval '
match($0,/[[:alnum:]]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2};XXX+[0-9]{4}+.*XXX+[0-9]{4}+;[0-9]{4}\-[0-9]{2}\-[0-9]{2}|[[:alnum:]]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2};XXX+[0-9]{4}+;[0-9]{4}\-[0-9]{2}\-[0-9]{2}/){
value2=substr($0,RSTART,RLENGTH);
num=split(value2,array,";");
print substr($0,1,RSTART-1) array[1],array[num],substr($0,RSTART+RLENGTH+1),array[2],array[1],array[3]
}'  OFS=";" input.txt

но это не сработало

1 Ответ

0 голосов
/ 03 июля 2018

РЕДАКТИРОВАТЬ: Кажется, что OP может иметь несколько вхождений регулярных выражений в строке, поэтому в соответствии с показанным примером изменил код, чтобы получить требуемый вывод следующим образом.

awk -v s1=";" --re-interval -F";" '
match($0,/[a-zA-Z ]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2};X+[0-9]+.*X+[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2}|[a-zA-Z ]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2};X+[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2}/){
   value2=value3=substr($0,RSTART,RLENGTH);
   split(value3,array,";");
   gsub(/;[0-9]{4}\-[0-9]{2}\-[0-9]{2};X+[0-9]+/,"",value2);
   print substr($0,1,RSTART-1) value2 s1 substr($0,RSTART+RLENGTH+1) s1 array[2] s1 array[1] s1 array[3];
   value2=""
}'  Input_file


Кажется, упомянутое регулярное выражение не работает, потому что строка object, упомянутая вами в предыдущем посте, изменилась на некоторые другие строки, поэтому я изменил регулярное выражение с совпадающей строки object на [a-zA-Z]+, и оно работало нормально следующим образом.

awk -v s1=";" --re-interval -F";" '
match($0,/[a-zA-Z]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2};X+[0-9]+.*X+[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2}|[a-zA-Z]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2};X+[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2}/){
  value2=substr($0,RSTART,RLENGTH);
  num=split(value2,array,";");
  print substr($0,1,RSTART-1) array[1] s1 array[num] s1 substr($0,RSTART+RLENGTH+1) s1 array[2] s1 array[1] s1 array[3]
}'  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...