Как отформатировать файл в формате csv после первой запятой в строке?

$ tr '}' '\n' <file | sed -E 's/^ ?\{//'
port1 dev1 M1 s
port1 dev1 M1 s
port3 dev2 M1 g
port1 dev1 M1 d
port1 dev1 M3 g

Este primero reemplaza cada }con una nueva línea usando tr. Esto le da al comando sedlíneas individuales para trabajar, donde cada línea comenzará con un posible espacio y un {. Estos caracteres se eliminan del comienzo de la línea con el comando sed.

Lo mismo con solosed:

sed -E -e 's/ ?\{//g' -e 'y/}/\n/'

El comando yfunciona como tren este ejemplo.


Usando GNU awko mawk, pero no BSDawk:

$ awk -v RS='[{}]' '/[^[:blank:]]/' file
port1 dev1 M1 s
port1 dev1 M1 s
port3 dev2 M1 g
port1 dev1 M1 d
port1 dev1 M3 g

Esto interpreta los datos como registros separados por {o }, y luego imprime cada registro que contiene algo más que tabulaciones o espacios.


Uso de Perl:

$ perl -ne 'map { print "$_\n" } /{(.*?)}/g' file
port1 dev1 M1 s
port1 dev1 M1 s
port3 dev2 M1 g
port1 dev1 M1 d
port1 dev1 M3 g

Esto aplica un comando printa cada elemento devuelto al hacer coincidir la expresión regular dada con la entrada. El comando printtambién agrega una nueva línea a cada elemento para ubicarlos en líneas individuales.

4
31.07.2019, 01:05
2 ответа

По рекомендации @Phillipos:

sed 'h;s/.*,//;s/./,"&"/g;x;G;s/,.*\n/"/;s/^/"/' inp.csv 

Пояснение:

Разделите пространство паттернов на две части и работайте с ними по отдельности, а затем соедините их вместе.

perl -lpe '$_ = q["]. join(q[","], unpack sprintf "A%dx(A)*", index $_, ","). q["]' inp.csv

Краткое пояснение:

° Construct the unpacking format for the input line by finding the location position of the comma, skip the comma from unpack, remaining are unpacked a char each. Then joined with the string ",", finally all enclosed in double quotes. 
4
27.01.2020, 20:55

IFS=, ; while read label string; do echo "\"$label\",$(echo $string| sed -e 's/\(.\)/\"\1\",/g' -e 's/,$//') "; done < inputfile

  • Разделить на метку и строку для преобразования, установив для IFS значение ','
  • Читать построчно со строки
  • пусть sed заменит "." (= каждый символ )с '"char",'...
  • и удалите ',' в конце строки
0
27.01.2020, 20:55

Теги

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