Дублировать строки и сделать их уникальными?

У меня есть следующая структура текстовых строк:

3923 001 L05 LV,L05 RM 3923 002 L12 RA,L12 LA 3923 003 I06 ALL 3923 004 G04 RV,Z09 ALL 

но мне это нужно:

 3923 001 L05 LV 3923 001 L05 RM 3923 002 L12 RA 3923 002 L12 LA 3923 003 I06 ALL 3923 004 G04 RV 3923 004 Z09 ALL 

Возможно ли это с помощью регулярного выражения?

В основном мне нужно, чтобы каждая строка копировала количество раз, когда оно содержит «,», а затем сделало уникальный запуск с 10-го символа; если бы я мог выполнить первую часть, так что просто копия каждой строки х сумма запятой, я мог бы очистить остальные вручную

  • Должен ли я закончить мои текстовые / скриптовые файлы с помощью новой строки?
  • Добавить значение в поле для заданного условия в определенном столбце файла
  • Как удалить все вхождения списка слов из текстового файла?
  • Как преобразовать файлы txt UTF-8 во все прописные буквы в bash?
  • Как сравнить несколько столбцов одного файла с одним столбцом другого и отображать совпадения из второго файла?
  • добавить имя файла в текст в углу файла изображения
  • Как похоронить невидимую метку в строках текста?
  • Используйте только строки, содержащие x или меньшее количество чисел. TXT-файл
  • 5 Solutions collect form web for “Дублировать строки и сделать их уникальными?”

    Учитывая формат вашего примера, это должно работать для любого количества разделенных запятыми строк после начального большого пространства (если это вкладка, просто измените пробелы во втором s/// на \t

     sed ':;h;s/,.*//;p;x;s/ [^,]*,/ /;t;d' file 3923 001 L05 LV 3923 001 L05 RM 3923 002 L12 RA 3923 002 L12 LA 3923 003 I06 ALL 3923 004 G04 RV 3923 004 Z09 ALL 

    Если вам нужны вкладки, тогда

    если вы хотите написать вкладку как \ t, вы можете передать ее Bash, используя $ '' quotes: sed $ ':; h; s /,.*//; p; x; s / \ t [^,] *, / /; t; d '. Или просто вставьте литеральную вкладку (для bash вам нужно ввести control-v, чтобы ввести ее буквально). ,

    – Тоби Спрайт

    Можно использовать sed. Соедините входной сигнал с нижеследующим.

     | sed 's/\(^.\{12\}\)\([^,]\+\),\([^,]\+\)/\1\2\n\1\3/' 

    вывод

     3923 001 L05 LV 3923 001 L05 RM 3923 002 L12 RA 3923 002 L12 LA 3923 003 I06 ALL 3923 004 G04 RV 3923 004 Z09 ALL 

    Вот источник для обработки ввода с несколькими ","

    Для исходного ввода без вкладки используйте

     | perl -ne '/,/ && do {chomp;s/^(.{12})(.+)/$1,$2/; @l = split(","); foreach $a (@l[1 .. $#l]) {print "$l[0]$a\n";};1;} || do {print;}' 

    Если вкладка имеет вкладку, используйте

     | perl -ne '/,/ && do{chomp; s/^([^\t]+\t)(.+)/$1,$2/; @l = split(","); foreach $a (@l[1 .. $#l]) {print "$l[0]$a\n";};1;} || do {print;}' 

    Возможное решение с awk :

     awk -F" " '{ x = $3 " " $4 " " $5; split(x, a, ","); for (i in a) { print $1, $2 "\t" a[i]; } }' file 

    Выход должен быть:

     3923 001 L05 LV 3923 001 L05 RM 3923 002 L12 RA 3923 002 L12 LA 3923 003 I06 ALL 3923 004 G04 RV 3923 004 Z09 ALL 

    И если ваш ввод содержит несколько , как в комментариях: 3923 001 L05 LV,L05 RM,L09 AB вы можете попробовать следующее:

     awk -F" " '{ x = $3; for (i = 4; i <= NF; i++) { x = x " " $i; } split(x, a, ","); for (i in a) { print $1, $2 "\t" a[i]; } }' file 

    Simplyfied вариант User112638726 ответ

     sed ':1;s/\(\(.*\s\s\+\)[^,]\+\),/\1\n\2/;t1' sed -r ':1;s/((.+\s\s+)[^,]+),/\1\n\2/;t1' 

    будет выбирать повторяющуюся часть как «любые символы до 2 (или более) пространств».

    Затем вы можете выводить трубы через

     uniq -s 10 

    Вы можете использовать awk и установить разделитель полей в пробелы или запятую. Затем, петля в блоках из 2, печать первого и второго полей вместе с блоками из двух:

     $ awk -v FS='(\\s+|,)' '{for (i=3; i<=NF; i+=2) print $1, $2, $i, $(i+1)}' file 3923 001 L05 LV 3923 001 L05 RM 3923 002 L12 RA 3923 002 L12 LA 3923 003 I06 ALL 3923 004 G04 RV 3923 004 Z09 ALL 
    Interesting Posts

    неизвестное / несанкционированное использование моей пропускной способности

    Можно ли добавить элемент в меню правой кнопки мыши Nautilus?

    «Wget -restrict-file-names = windows», похоже, не удалось преобразовать ссылки для NTFS

    rsync зависает после нескольких переданных файлов (Bash для Windows для FreeBSD)

    Есть ли способ защитить файл от удаления, но не от изменения?

    Как автоматически добавить новый путь к переменной $ PATH после установки пакета RPM?

    Шифрование всего диска

    Номера раскраски меньше?

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

    Смущает смысл интерактивной и неинтерактивной оболочки при запуске скрипта

    Новое окно терминатора на удаленном сервере

    Как просканировать два промежуточных сервера на сервер третьего хоста

    Не удается запустить startx на Debian после некоторых изменений

    Измените размер физического объема, resize2fs не будет работать с ним

    Когда интерпретировать awk как команду или язык программирования?

    Linux и Unix - лучшая ОС в мире.