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

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

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

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

  • Как создать файл CSV без лишних пробелов?
  • Как я могу использовать несколько операторов if внутри другого if инструкции awk-программы?
  • Команда unix для усечения каждой строки файла
  • Сортировка файла CSV, но не его заголовок
  • Использование фиксированных строк в регулярных выражениях?
  • Что касается генерации пересечения и объединения двух CSV-файлов
  •  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-го символа; если бы я мог выполнить первую часть, так что просто копия каждой строки х сумма запятой, я мог бы очистить остальные вручную

  • Проверка, является ли входной номер целым числом
  • объединить файлы csv по первому столбцу
  • Извлечение URL из неформатированного текста
  • Использование Regex в vim movment
  • Печать текста между двумя шаблонами, не содержащими конкретного слова
  • Объединение двух CSV по сравнению только с определенным столбцом
  • 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 
    Linux и Unix - лучшая ОС в мире.