Например, у меня есть текстовый файл со следующими строками.
Ввод
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
Предполагая, что это метки даты/времени и увеличиваются в последовательности, тогда
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 в своем примере.