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

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

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-го символа; если бы я мог выполнить первую часть, так что просто копия каждой строки х сумма запятой, я мог бы очистить остальные вручную

  • Как пропустить файл в sed, если он содержит регулярное выражение?
  • Как создать текстовый файл (1 гигабайт), содержащий случайные символы с кодировкой символов UTF-8?
  • Как сравнить несколько столбцов одного файла с одним столбцом другого и отображать совпадения из второго файла?
  • добавить имя файла в текст в углу файла изображения
  • Постоянная запись вывода терминала в текстовый файл
  • Текстовый интерфейс пользователя
  • Как выбрать, скопировать и вставить некоторые столбцы из разных файлов и создать из них один файл?
  • Сравните все текстовые файлы в каталоге и сортируйте по сходству
  • 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

    Тип и скорость процессора с помощью команды lscpu

    ` <defunct>` с несуществующими детьми -> Любой способ их сбора?

    Есть ли какой-либо параметр rsync для показа в конце внесенных изменений?

    как исключить диапазон чисел, используя регулярное выражение

    rsync: сравнить каталоги с символическими ссылками

    Создание загрузочной резервной копии системного диска

    изменять и манипулировать строками в файле с помощью awk

    Сумма чисел с использованием awk

    переадресация сокетов tcp от нескольких последовательных клиентов к одному постоянному подключению сокета к серверу

    Различия в производительности при записи в / dev / sda и в / mnt / sda / tempfile

    Корневая учетная запись MySQL без пароля?

    Apache (не браузер) кэширует мой файл

    Где лучшее место для размещения пользовательского программного обеспечения?

    Как найти причину, по которой просыпается ноутбук?

    Завершение zsh: получение имен файлов из определенного каталога

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