Как дублировать каждую строку с помощью команд оболочки?

С perl, предполагая, что поля в вашем CSV не не содержит встроенных запятых, новых строк и т. д.:

perl -lpe '$_ = join ",", reverse split /,/' input.csv
1
16.05.2017, 10:58
3 ответа

Простой цикл awk

awk -v num=3 'BEGIN {OFS=FS=","} 
  {tmp=$2; print; for (i=1;i<=num;i++) {$2=tmp"_"i; print}}
  ' file

Настройте число по желанию.

0
28.01.2020, 00:55
perl -pse '$l = $_;
   for my $k ( 1 .. $N ) { s/\z/$l =~ s|^[^,]+,[^,]+\K|_$k|r/e }
' -- -N=3 -- Input.data

Рабочая

  • опция -p устанавливает неявное чтение файла в цикле + автопечать записей.
  • -s позволяет задавать переменные из командной строки, в нашем случае $N. YMMV.
  • Сохраните текущую запись в $l.
  • Мы зацикливаем и добавляем в текущую запись содержимое $l, измененное в том месте, где находится вторая запятая.
0
28.01.2020, 00:55

По существу, вы хотите повторить каждую строку четыре раза с разными суффиксами после второго поля?

sed 'p;s/,/_1,/2p;s/_1/_2/p;s/_2/_3/' file

Это p для печати строки как есть; первая команда s добавляет _1 перед второй запятой и печатает; вторая и третья s заменяется на _2 и _3, вторая носит флаг p для печати строки, а последняя версия печатается по умолчанию.

Изменить после расширенного вопроса

Если вы хотите зациклить заданное количество итераций, вы можете сделать

sed 'p;s/,/_1,/2p;G;s/$/0123456789+/;:a
s/\(_[0-9]*\)\([0-9]\)\(,.*\n.*\2\)\(.\)/\1\4\3\4/
s/_+/_10/;s/\(_[0-9]*\)\([0-9]\)+\(.*\n.*\2\)\(.\)/\1\40\3\2\4/
/_+/!P
/_123,/! ta
d' file

, где 123 в предпоследней строке — максимальный индекс. В данный момент у меня нет времени объяснять, но я могу сделать это позже, если вы хотите понять, что происходит.

0
28.01.2020, 00:55

Теги

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