Заменить текст в строках в файле с приращениями - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть файл с несколькими строками (количество строк неизвестно)

DD0TRANSID000019021210504250003379433005533665506656000008587201902070168304000.0AK  0000L00000.00  N          01683016832019021220190212N0000.001683065570067.000000.00000.0000000000000NAcknowledgment                                                                                                                                        
DD0TRANSID000019021210505110003379433005535567606656000008587201902085381804000.0FC  0000L00000.00  N          53818538182019021220190212N0000.053818065570067.000000.00000.0000000000000NFirst Contact                                                                                                                                         
DD0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR  0000L00000.00  N          53818538182019021220190212N0000.053818065570067.000000.00000.0000000000000NStatus Report                                                                                                                                         

Текст TRANSID000 находится в каждой строке, начиная с 3-го по 10-е место, мне нужно иметь возможность заменить его на TRAN000066 вприращение 1

66 - это переменная, которую я получаю из другого файла (скажем, nextcounter) для хранения начала счетчика.Как только программа обновит все строки, я смогу захватить последний номер и обновить файл nextcounter вместе с ним.

Вывод

DD0TRAN00066019021210504250003379433005533665506656000008587201902070168304000.0AK  0000L00000.00  N          01683016832019021220190212N0000.001683065570067.000000.00000.0000000000000NAcknowledgment                                                                                                                                        
    DD0TRAN00067019021210505110003379433005535567606656000008587201902085381804000.0FC  0000L00000.00  N          53818538182019021220190212N0000.053818065570067.000000.00000.0000000000000NFirst Contact                                                                                                                                         
    DD0TRAN00068019021210510360003379433005535568006656000008587201902085381804000.0SR  0000L00000.00  N          53818538182019021220190212N0000.053818065570067.000000.00000.0000000000000NStatus Report                                                                                                                                         

Я пробовал awk sed и perl, ноэто не дает мне желаемых результатов.Пожалуйста, предложите.

Ответы [ 3 ]

0 голосов
/ 08 апреля 2019

Простой цикл

s=66; while read l; do echo "$l" | sed "s/TRANSID000/TRAN$(printf '%06d' $s)/" ; s=$((s+=1)); done < inputFile > outputFile; echo $s > counterFile
0 голосов
/ 09 апреля 2019

Вальтер Ответ почти идеален, пропущены необходимые строки 3-10 предела.Таким образом, улучшенный ответ:

    awk -v start=66 'NR > 2 && NR < 11{ sub(/TRANSID000/, "TRAN0000" start++); print }' inputfile
0 голосов
/ 08 апреля 2019

Когда вы хотите использовать sed, вы можете захотеть использовать цикл, избегая уродливого

sed '=' inputfile | sed -r '{N;s/(.*)\n(.*)(TRANSID000)(.*)/echo "\2TRAN0$((\1+65))\4"/e}'

Это намного проще с awk:

awk -v start=66 '{ sub(/TRANSID000/, "TRAN0" start++); print }' inputfile

РЕДАКТИРОВАТЬ: OP запрашивает replace TRANSID with TRAN0, я показал это в отредактированном решении.Когда я просматриваю пример выходных данных, дополнительные 0 не нужны.
Другой вопрос - что происходит, когда счетчик выходит за 99. Если удаляется один из ведущих нулей (с такой конструкцией, как printf "%.4d"),или длина линии будет еще на 1?

DD0TRAN00099019...
DD0TRAN00100019...
# or
DD0TRAN00099019...
DD0TRAN000100019...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...