¿Cómo usar la bandera -p de BSD split?

1

manual

-p pattern
         The file is split whenever an input line matches pattern,
         which is interpreted as an extended regular expression.  The
         matching line will be the first line of the next output file.
         This option is incompatible with the -b and -l options.

Código

seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | split -p '060'

que hace una secuencia del 1 al 10, elimina las líneas vacías para tener un megastring y luego se divide en 060 en dos archivos sin éxito, dando split: invalid option -- 'p' .

El comando seq -w 1 1 10 | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}' en el comentario da

  

campo1: 01 campo2: 060 campo1: 02 campo2: 060 campo1: 03 campo2: 060 campo1: 04 campo2: 060 campo1: 05 campo2: 060 campo1: 06 campo2: 060 campo1: 07 campo2: 060 campo1: 08 campo2: 060 field1: 09 field2: 060 field1: 10 field2: 060

que no es lo que quiero. Quiero dividir el archivo en la marca 060 en dos archivos. Puede incluir 060 a cualquiera de los archivos.

¿Cómo se puede usar la bandera -p en BSD Split en OSX?

    
pregunta Léo Léopold Hertz 준영 06.07.2015 - 10:34

2 respuestas

2

El problema se debe a que la división BSD está más adelante en su ruta que la división GNU (que no admite la opción -p ). Si haces un echo $PATH deberías ver esto: /usr/local/opt/coreutils/libexec/gnubin estará antes de /usr/bin en la salida.

Para llamar directamente a BSD split, use la ruta completa - canalización a /usr/bin/split en lugar de split .

Tu comando original se convertirá en:

seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | split -p '060'
    
respondido por el mjturner 06.07.2015 - 11:08
1

split opera en múltiples archivos de línea, no en un solo archivo de línea o cadena. En el siguiente ejemplo, estoy usando jot porque seq no está en mi sistema. También estoy usando BSD sed con una adición que cambia el marcador 060 a dos puntos. Esto produce la cadena 0102030405:7080910 . Añadimos el 060 de nuevo en el segundo archivo.

    jot -w "%02d" 10 1                                     |
    sed -e ':a' -e 'N' -e '$!ba' -e 's/\n//g' -e 's/060/:/'|
    IFS=: read -r one two
    echo "$one" > file1
    echo "060${two}" > file2
    
respondido por el fd0 17.07.2015 - 22:04

Lea otras preguntas en las etiquetas