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 060
en 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 060
en dos archivos. Puede incluir 060
en cualquier archivo.
¿Cómo puedes usar la bandera -p en BSD Split en OSX?
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 -p
opción). Si hace un echo $PATH
debería ver esto - /usr/local/opt/coreutils/libexec/gnubin
será antes /usr/bin
en la salida.
Para llamar a BSD split directamente, use la ruta completa - pipe to /usr/bin/split
en lugar de split
.
Su comando original se convertirá en:
secuencia -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | dividir -p '060'
man split
sea sobre split
el comando?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.split
divide un archivo de varias líneas en varios archivos, utilizando el -p
patrón. Como solo está usando una sola línea de entrada, eso es lo que sale. split
no divide una línea coincidente, la usa como el comienzo del siguiente archivo. ¡Ojalá eso tenga sentido!split
:| awk -F'060' '{print "field1: "$1 "\nfield2: "$2}'
awk
comando 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}'
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: 060
que no es lo que quiero. Quiero dividir el archivo en la marca 060
en dos archivos. Puede incluir 060
en cualquier archivo.field1: 0102030405
y 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}'
split
opera en archivos de varias líneas, no en un archivo de una sola 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 la 060
parte 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
jot -w "%02d" 10 1 | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n//g' -e 's/060/:/' | IFS=: read -r one two
no 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í read
hay alguna variante de Linux.0102030405:7080910
. Trato de tener OSX pronto en mis dedos. ¿Qué -r
hace esta bandera? Intento hacerlo con este Debian 8.1.bash
. Simplemente escriba help read
para obtener una explicación.help
eso obtengo -r do not allow backslashes to escape any characters
_
mjturner
split
. ¿Quéwhich split
regresa?Léo Léopold Hertz 준영
man split
es sobre BSD, mientras que el actualsplit
es sobre GNU.usuario3439894
seq
ygsed
alawk
sustituirsplit
? La siguiente salida de comandos es de dos líneas, una esfield1: 0102030405
y la otra esfield2: 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}'