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

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 una megacadena y luego se divide 060en dos archivos dando sin éxito split: invalid option -- 'p'.

Comando seq -w 1 1 10 | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'en 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 campo1: 09 campo2: 060 campo1: 10 campo2: 060

que no es lo que quiero. Quiero dividir el archivo en la marca 060en dos archivos. Puede incluir 060en cualquier archivo.

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

El hecho de que obtenga una "opción no válida" sugiere que es posible que no esté llamando al split. ¿Qué which splitregresa?
@mjturner Agregué la salida de su comando. Sí, parece que algo anda mal en mi sistema. Mi manual man splites sobre BSD, mientras que el actual splites sobre GNU.
¿ Por qué no está utilizando los comandos seqy gsedal awksustituir split? La siguiente salida de comandos es de dos líneas, una es field1: 0102030405y la otra es field2: 0607080910. El comando es:seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'

Respuestas (2)

El problema se debe a que la división BSD se encuentra más tarde en su ruta que la división GNU (que no admite la -popción). Si hace un echo $PATHdebería ver esto - /usr/local/opt/coreutils/libexec/gnubinserá antes /usr/binen la salida.

Para llamar a BSD split directamente, use la ruta completa - pipe to /usr/bin/spliten lugar de split.

Su comando original se convertirá en:

secuencia -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | dividir -p '060'
¿Cómo se pueden establecer PATH y MANPATH consistentes de modo que el comando man splitsea sobre splitel comando?
Si desea que los comandos GNU se instalen con un prefijo, deberá volver a instalarlos. Una vez hecho esto, modifique su PATH y MANPATH en sus archivos de configuración de shell en consecuencia. ¿Cómo instalaste los comandos GNU? Tengo la sensación de compilar a mano; si es así, mejor use un administrador de paquetes como pkgsrc, MacPorts o Homebrew. Mucho mejor que compilar desde la fuente.
¿ De qué es tu salida seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | /usr/bin/split -p '060'? Solo obtengo la cadena original. Nada dividido en absoluto.
@Masi Eso es por diseño. splitdivide un archivo de varias líneas en varios archivos, utilizando el -ppatrón. Como solo está usando una sola línea de entrada, eso es lo que sale. splitno divide una línea coincidente, la usa como el comienzo del siguiente archivo. ¡Ojalá eso tenga sentido!
Sí, tiene sentido. Tengo datos en una megalínea. ¿Cuál es la opción de dividir en línea? Necesito esta división en línea porque parte del contenido puede ser una dos líneas donde una coincidencia no funciona en varias líneas.
@Masi Deberá darnos un ejemplo adecuado, pero con los datos proporcionados puede hacer lo siguiente en lugar de canalizar a split:| awk -F'060' '{print "field1: "$1 "\nfield2: "$2}'
@mjturner, su awkcomando propuesto divide la cadena, por así decirlo, sin embargo, su salida descarta "060" (ya que está configurado como separador de campo) de la cadena y creo que Masi no quiere que se descarten los datos. ¿Sería apropiado lo siguiente?awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'
@ user3439894 El resultado es field1: 01 field2: 060 field1: 02 field2: 060 field1: 03 field2: 060 field1: 04 field2: 060 field1: 05 field2: 060 field1: 06 field2: 060 field1: 07 field2: 060 field1: 08 field2: 060 field1: 09 field2: 060 field1: 10 field2: 060que no es lo que quiero. Quiero dividir el archivo en la marca 060en dos archivos. Puede incluir 060en cualquier archivo.
@Masi, no sé cómo está obteniendo todos esos campos, sin embargo, la salida de los siguientes comandos es de dos líneas, una es field1: 0102030405y la otra es field2: 0607080910. El comando es:seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'

splitopera en archivos de varias líneas, no en un archivo de una sola línea o cadena. En el siguiente ejemplo, estoy usando jotporque seqno está en mi sistema. También estoy usando BSD sedcon una adición que cambia el marcador 060a dos puntos. Esto produce la cadena 0102030405:7080910. Añadimos la 060parte de atrás 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
Esto jot -w "%02d" 10 1 | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n//g' -e 's/060/:/' | IFS=: read -r one twono me da nada como salida. ¿Cuál es su producción en esa etapa? El problema es con IFS=... Mi actualmente en Debian 8.1 aquí readhay alguna variante de Linux.
Los dos primeros comandos me dan correctamente 0102030405:7080910. Trato de tener OSX pronto en mis dedos. ¿Qué -rhace esta bandera? Intento hacerlo con este Debian 8.1.
Supongo que estás usando bash. Simplemente escriba help readpara obtener una explicación.
¡Gracias! yo no sabia helpeso obtengo -r do not allow backslashes to escape any characters_