РЕДАКТИРОВАТЬ: Улучшение моего предыдущего решения тоже сейчас.
awk --re-interval '
match($0,/object[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2};X+[0-9]+.*X+[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2}|object[0-9]+;[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],array[num],substr($0,RSTART+RLENGTH+1),array[2],array[1],array[3]
}
' OFS=";" Input_file
Не могли бы вы попробовать и дайте мне знать, если это вам поможет.
awk --re-interval '
match($0,/object[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2};X+[0-9]+.*X+[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2}|object[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2};X+[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2}/){
value1=value2=substr($0,RSTART,RLENGTH);
sub(/.*;/,"",value1);
split(value2,array,";");
print substr($0,1,RSTART-1) array[1],value1,substr($0,RSTART+RLENGTH+1),array[2],array[1],array[3]
}
' OFS=";" Input_file
Вывод будет следующим.
04120;2017-12-27;object1;2017-12-27;object2;2017-12-27;object3;2017-12-27;object4;2018-03-06;object5;2018-03-06;object6;2017-12-28;object4;XXXXXX1
06499;2018-05-30;object1;2018-05-30;object2;2018-05-30;object3;2018-05-31;object4;2018-05-30;object3;XXXXXX1
04123;2017-12-28;object1;2018-04-05;object2;2017-12-28;object1;XXXXXX1
04520;2018-02-11;object1;2018-02-11;object2;2018-03-10;object3;2018-02-16;object2;XXXXXX1
04510;2018-02-09;object1;2018-02-09;object2;2018-04-04;object3;2018-02-09;object2;XXXXXX1
ПРИМЕЧАНИЕ: Только старая версия awk
имеет --re-interval
, вы можете удалить ее, если ваша awk
версия новая.