У меня есть следующий файл.
101; John Bauer; 811-7780831;
102; Anthony Higgins; 844-4317627;
102; Anthony Higgins; 844-4317627;
103; Arnold Sipes; 866-4343123;
104; Donald Quinn; 877-2828732;
105; Roy Jaeger; 551-2323001;
105; Roy Jaeger; 551-2323001;
105; Roy Jaeger; 551-2323001;
Я пытаюсь использовать sed
заменять первый столбец файла с автоматическим инкрементом оценивает, начиная с одного. Окончательный результат должен быть чем-то вроде этого.
1; John Bauer; 811-7780831;
2; Anthony Higgins; 844-4317627;
2; Anthony Higgins; 844-4317627;
3; Arnold Sipes; 866-4343123;
4; Donald Quinn; 877-2828732;
5; Roy Jaeger; 551-2323001;
5; Roy Jaeger; 551-2323001;
5; Roy Jaeger; 551-2323001;
Если первое значение первых повторений столбца, это должно присвоить то же значение, следовательно дубликат оценивает "выходным" файлом.
Действительно ли это возможно?
Использование Perl:
perl -F\; -lane 'BEGIN {$, = ";"} $F[0] = $F[0] - 100; print(@F)' file
Отредактировать оперативный файл:
perl -i -F\; -lane 'BEGIN {$, = ";"} $F[0] = $F[0] - 100; print(@F)' file
-i
: указывает, что файлы, обработанные" <>" конструкция, должны быть отредактированы оперативные.-F\;
: устанавливает разделитель поля ввода на ;
-l
: включает автоматическую заканчивающую строку обработку. Это имеет два отдельных эффекта. Во-первых, это автоматически громко жует $ / (входной разделитель записей) при использовании с-n или-p. Во-вторых, это присваивает $\\(выходной разделитель записей), чтобы иметь значение octnum так, чтобы любые операторы печати имели тот разделитель включенным назад. Если octnum опущен, $наборов \\к текущему значению $/.-a
: включает режим авторазделения при использовании с-n или-p. Неявная команда разделения к массиву @F сделана как первая вещь в неявном цикле с условием продолжения, произведенном-n или-p.n
: Perl причин для принятия следующего цикла вокруг программы, которая заставляет его выполнить итерации по аргументам имени файла несколько как sed-n или awk:
LINE:
while (<>) {
... # your program goes here
}
-e
: может использоваться для ввода одной строки программы.BEGIN {$, = ";"} $F[0] = $F[0] - 100; print(@F)
: устанавливает выходного разделителя полей на ;
, присваивает первому полю его значение, уменьшенное на 100, и печатает запись.% cat file
101; John Bauer; 811-7780831;
102; Anthony Higgins; 844-4317627;
102; Anthony Higgins; 844-4317627;
103; Arnold Sipes; 866-4343123;
104; Donald Quinn; 877-2828732;
105; Roy Jaeger; 551-2323001;
105; Roy Jaeger; 551-2323001;
105; Roy Jaeger; 551-2323001;
% perl -F\; -lane 'BEGIN {$, = ";"} $F[0] = $F[0] - 100; print(@F)' file
1; John Bauer; 811-7780831
2; Anthony Higgins; 844-4317627;
2; Anthony Higgins; 844-4317627
3; Arnold Sipes; 866-4343123
4; Donald Quinn; 877-2828732
5; Roy Jaeger; 551-2323001
5; Roy Jaeger; 551-2323001
5; Roy Jaeger; 551-2323001
Ваш шаблон в основном, "делают первый столбец равным значению - 100". AWK подходит для этого
$ awk -F';' 'BEGIN{OFS=";"}{$1=$1-100;print }' personList.txt
1; John Bauer; 811-7780831;
2; Anthony Higgins; 844-4317627;
2; Anthony Higgins; 844-4317627;
3; Arnold Sipes; 866-4343123;
4; Donald Quinn; 877-2828732;
5; Roy Jaeger; 551-2323001;
5; Roy Jaeger; 551-2323001;
5; Roy Jaeger; 551-2323001;
нет никакого оперативного редактирования, так перенаправьте вывод в новый файл.
$ awk -F';' 'BEGIN{OFS=";"}{$1=$1-100;print }' personList.txt | tee newFile.txt
1; John Bauer; 811-7780831;
2; Anthony Higgins; 844-4317627;
2; Anthony Higgins; 844-4317627;
3; Arnold Sipes; 866-4343123;
4; Donald Quinn; 877-2828732;
5; Roy Jaeger; 551-2323001;
5; Roy Jaeger; 551-2323001;
5; Roy Jaeger; 551-2323001;
Для обращения, что Вы спросили в комментариях (делающий поле № 4, "Не Доступное", если это пусто), Вы могли бы протестировать на 4 символа использования цифры класса, если оператор и regex
$ awk -F';' 'BEGIN{OFS=";"}{$1=$1-100; if ($4 !~ /[[:digit:]]{4}/) $4=" N/A" ;print }' personList.txt
1; John Bauer; 811-7780831; 1001;
2; Anthony Higgins; 844-4317627; N/A;
2; Anthony Higgins; 844-4317627; N/A;
3; Arnold Sipes; 866-4343123; N/A;
4; Donald Quinn; 877-2828732; N/A;
5; Roy Jaeger; 551-2323001; 1267;
5; Roy Jaeger; 551-2323001; 1273;
5; Roy Jaeger; 551-2323001; 1204;
, Кроме того, Вы могли бы сделать что-то вроде этого с если оператор
if ( $4 !~ /.*[0-9].*/ )