예를 들어, 다음 줄이 포함된 텍스트 파일이 있습니다.
입력하다
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
답변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
그런데, 귀하의 예에서는 위치 28에서 0을 제거한 것 같습니다.