Заменить группу похожего текста в строке с n-й позиции на одну строку, иначе увеличить значение на +1

Например, у меня есть текстовый файл со следующими строками.

Ввод

DD0TRANSID000019021210504250003379433005533665506656000008587201902070168304000.0AK  0000L00000.00  N          01683016832019021220190212N0000.001683065570067.000000.00000.0000000000000NAcknowledgment                                                                                                                                        
DD0TRANSID000019021210504250003379433005535567606656000008587201902085381804000.0FC  0000L00000.00  N          53818538182019021220190212N0000.053818065570067.000000.00000.0000000000000NFirst Contact                                                                                                                                         
DD0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR  0000L00000.00  N          53818538182019021220190212N0000.0
CC0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR  0000L00000.00  N          53818538182019021220190212N0000.0

Мое требование Если строка начинается с «D», замените строку, начинающуюся с 14-й позиции на 27-ю, на D00000X (где X — число с левым отступом)

Если я столкнусь с тем же значением строки между 14-й и 27-й позицией, с которой я столкнулся раньше в файле я должен заменить на D00000X, иначе на D00000X+1

Вывод

DD0TRANSID00001902121D000006003379433005533665506656000008587201902070168304000.0AK  0000L00000.00  N          01683016832019021220190212N0000.001683065570067.000000.00000.0000000000000NAcknowledgment                                                                                                                                        
DD0TRANSID00001902121D000006003379433005535567606656000008587201902085381804000.0FC  0000L00000.00  N          53818538182019021220190212N0000.053818065570067.000000.00000.0000000000000NFirst Contact                                                                                                                                         
DD0TRANSID00001902121D000007003379433005535568006656000008587201902085381804000.0SR  0000L00000.00  N          53818538182019021220190212N0000.0
CC0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR  0000L00000.00  N          53818538182019021220190212N0000.0
0
08.04.2019, 19:55
1 ответ

Предполагая, что это метки даты/времени и увеличиваются в последовательности, тогда

a=($(grep -Po "(?<=^D.{13}).{13}" testfile | uniq))
for ((i=0; i<${#a[@]}; i+=1)); do
    s=${a[$i]}
    sed -E -i "s/(D.{13})$s/\1${s:0:7}D$(printf '%06d' $((i+1)))/g" testfile
done

Если штамп повторяется дальше по файлу, он получает новое приращение счетчика. Если вы этого не хотите, тогда uniqдолжно быть sort | uniq, которое будет применять один и тот же счетчик к одному и тому же штампу во всем файле.

Кстати, похоже, вы удалили 0 в позиции 28 в своем примере.

0
28.01.2020, 03:51

Теги

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