Добавление новой строки после каждого N-го появления разделителя [дубликат]

Для установки grub Customizer выполните следующую команду:

apt-get install build-essential cmake libgtkmm-3.0-dev libssl-dev gettext libarchive-dev 
wget https://goo.gl/qQnUhK -O grub-customizer_4.0.6.tar.gz 
tar xfv grub-customi* 
cd grub-customi* 
cmake . && make -j3 
make install
3
22.11.2018, 00:09
3 ответа

Al menos con GNU sedy suponiendo que sus campos no pueden contener separadores de coma incrustados , podría hacer

sed 's/,/\n/6; P; D' roll.txt

que intenta repetidamente reemplazar la sexta coma con una nueva línea, imprimir y luego eliminar la parte del espacio del patrón hasta la nueva línea.

NOTA :no es necesario implementar una prueba/bifurcación etiquetada explícitamente, ya que el comando Dimplícitamente "reinicia el ciclo" en el resto de la línea:

D
If pattern space contains no newline, start a normal new cycle as if the d command was issued. Otherwise, delete text in the pattern space up to the first newline, and restart cycle with the resultant pattern space, without reading a new line of input.

(crédito a @RakeshSharma por aclarar esto ).

Ej.

sed 's/,/\n/6; P; D' roll.txt 
'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345','567'

Alternativamente, con el módulo Text::CSVde Perl:

perl -MText::CSV -ne '
  BEGIN{$p = Text::CSV->new()} 
  @fields = $p->fields() if $p->parse($_); 
  do {
    print join ",", splice @fields, 0, 6; print "\n";
  } while @fields
' roll.txt
'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345','567'
2
27.01.2020, 21:21

Con trypaste:

tr ',' '\n' <infile |paste -sd',,,,,\n'

para una mayor legibilidad y comprensión:

tr ',' '\n' <infile |paste --serial --delimiters=',,,,,\n'

En tal caso, cuando desea agregar una nueva línea en cada posición,N = 100 , es posible que no prefiera ingresar 99 comas ',,,,,,,,,,...,\n'; en su lugar, deje que printflo genere por usted con la expansión de llaves -.

tr ',' '\n' <infile |paste -sd $(printf '%.1s',{1..99})'\n'

deman paste:

-d, --delimiters=LIST
       reuse characters from LIST instead of TABs

-s, --serial
       paste one file at a time instead of in parallel
5
27.01.2020, 21:21

Una variación de la respuesta de αғsнιη:

$ tr ',' '\n' <file | paste -d, - - - - - -
'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345','567'

Esto supone que ninguno de los campos tiene comas incrustadas.

Si la entrada no tiene un múltiplo de seis campos, puede obtener una salida como

'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345','567'
hello,world,,,,
0
27.01.2020, 21:21

Теги

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