Замените первый столбец на файле

У меня есть следующий файл.

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;

Если первое значение первых повторений столбца, это должно присвоить то же значение, следовательно дубликат оценивает "выходным" файлом.

Действительно ли это возможно?

3
задан 4 February 2016 в 21:18

2 ответа

Использование 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
1
ответ дан 1 December 2019 в 16:25

Ваш шаблон в основном, "делают первый столбец равным значению - 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].*/ )
2
ответ дан 1 December 2019 в 16:25

Другие вопросы по тегам:

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