Handbuch
-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.
Code
seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | split -p '060'
die eine Sequenz von 1 bis 10 erstellt, leere Zeilen entfernt, um einen Megastring zu erhalten, und dann at 060
in zwei Dateien aufteilt, die erfolglos split: invalid option -- 'p'
.
Befehl seq -w 1 1 10 | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'
im Kommentar gibt
Feld1: 01 Feld2: 060 Feld1: 02 Feld2: 060 Feld1: 03 Feld2: 060 Feld1: 04 Feld2: 060 Feld1: 05 Feld2: 060 Feld1: 06 Feld2: 060 Feld1: 07 Feld2: 060 Feld1: 08 Feld2: 060 Feld1: 09 Feld2: 060 Feld1: 10 Feld2: 060
was ich nicht will. Ich möchte die Datei an der Markierung in zwei Dateien aufteilen 060
. Sie können 060
beide Dateien einschließen.
Wie können Sie das Flag -p in BSD Split in OSX verwenden?
Das Problem wird dadurch verursacht, dass der BSD-Split später in Ihrem Pfad liegt als der GNU-Split (der die Option nicht unterstützt -p
). Wenn Sie dies tun, echo $PATH
sollten Sie dies sehen - /usr/local/opt/coreutils/libexec/gnubin
wird vorher /usr/bin
in der Ausgabe sein.
Um BSD Split direkt aufzurufen, verwenden Sie den vollständigen Pfad - pipe to /usr/bin/split
statt split
.
Ihr ursprünglicher Befehl wird dann zu:
seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | split -p '060'
man split
um einen Befehl handelt split
?seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | /usr/bin/split -p '060'
? Ich bekomme nur den Originalstring. Da hat sich gar nichts gespalten.split
teilt eine mehrzeilige Datei unter Verwendung des -p
Musters in mehrere Dateien auf. Da Sie nur eine einzige Eingabezeile verwenden, ist dies die Ausgabe. split
teilt keine übereinstimmende Zeile, sondern verwendet sie als Anfang der nächsten Datei. Das macht hoffentlich Sinn!split
:| awk -F'060' '{print "field1: "$1 "\nfield2: "$2}'
awk
Befehl teilt die Zeichenfolge sozusagen, aber seine Ausgabe verwirft "060" (da es als Feldtrennzeichen festgelegt ist) aus der Zeichenfolge, und ich glaube, Masi möchte nicht, dass Daten verworfen werden. Wäre folgendes angemessen?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
nicht das, was ich will. Ich möchte die Datei an der Markierung in zwei Dateien aufteilen 060
. Sie können 060
beide Dateien einschließen.field1: 0102030405
und die andere ist field2: 0607080910
. Der Befehl lautet:seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'
split
arbeitet mit mehrzeiligen Dateien, nicht mit einer einzeiligen Datei oder einem String. Im folgenden Beispiel verwende ich jot
weil seq
in nicht auf meinem System. Außerdem verwende ich BSD sed
mit einem Zusatz, der die Markierung 060
in einen Doppelpunkt ändert. Dies erzeugt die Zeichenfolge 0102030405:7080910
. Wir fügen den 060
Rücken in die zweite Datei ein.
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
gibt mir nichts als Ausgabe. Was ist Ihr Output in dieser Phase? Das Problem ist mit IFS=... Mein derzeit in Debian 8.1 hier read
ist irgendeine Linux-Variante.0102030405:7080910
. Ich versuche OSX bald in die Finger zu bekommen. Was -r
macht diese Flagge? Ich versuche es mit diesem Debian 8.1.bash
. Geben Sie einfach help read
eine Erklärung ein.help
. Ich bekomme -r do not allow backslashes to escape any characters
.
mjturner
split
. Was kommtwhich split
zurück?Léo Léopold Hertz 준영
man split
geht es um BSD, während mein eigentlichessplit
um GNU geht.Benutzer3439894
seq
als auch beim Ersetzen von ? Die Ausgabe der folgenden Befehle besteht aus zwei Zeilen, eine ist und die andere ist . Der Befehl lautet:gsed
awk
split
field1: 0102030405
field2: 0607080910
seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'