podręcznik
-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.
Kod
seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | split -p '060'
co tworzy sekwencję od 1 do 10, usuwa puste linie, aby mieć megastring, a następnie dzieli się na 060
dwa pliki, które nie dają rezultatu split: invalid option -- 'p'
.
Komenda seq -w 1 1 10 | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'
w komentarzu daje
pole1: 01 pole2: 060 pole1: 02 pole2: 060 pole1: 03 pole2: 060 pole1: 04 pole2: 060 pole1: 05 pole2: 060 pole1: 06 pole2: 060 pole1: 07 pole2: 060 pole1: 08 pole2: 060 pole1: 09 field2: 060 field1: 10 field2: 060
co nie jest tym czego chcę. Chcę podzielić plik przy znaku 060
na dwa pliki. Możesz dołączyć 060
do dowolnego pliku.
Jak używać flagi -p w BSD Split w OSX?
macos
command-line
unix
Léo Léopold Hertz 준영
źródło
źródło
split
. Cowhich split
zwracaman split
dotyczy BSD, podczas gdy mój faktsplit
dotyczy GNU.seq
igsed
poleceń podczas podstawiającawk
zasplit
? Następujące dane wyjściowe poleceń to dwa wiersze, jeden jest,field1: 0102030405
a drugi jestfield2: 0607080910
. Polecenie to:seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'
Odpowiedzi:
Problem jest spowodowany tym, że podział BSD jest później na twojej ścieżce niż podział GNU (który nie obsługuje tej
-p
opcji). Jeśli to zrobiszecho $PATH
, powinieneś to zobaczyć -/usr/local/opt/coreutils/libexec/gnubin
będzie przed/usr/bin
wyjściem.Aby bezpośrednio wywołać split BSD, użyj pełnej ścieżki - potok do
/usr/bin/split
zamiastsplit
.Twoje oryginalne polecenie stanie się wtedy:
źródło
man split
dotyczyłosplit
polecenia?split
dzieli plik z wieloma wierszami na wiele plików, używając-p
wzorca. Ponieważ używasz tylko jednego wiersza danych wejściowych, to jest wynik.split
nie dzieli pasującej linii, używa go jako początku następnego pliku. Mam nadzieję, że to ma sens!awk
polecenie dzieli ciąg, że tak powiem, ale jego wynik odrzuca „060” (ponieważ jest ustawiony jako separator pól) z łańcucha i uważam, że Masi nie chce, aby dane były odrzucane. Czy następujące byłoby właściwe?awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'
field1: 0102030405
a druga jestfield2: 0607080910
. Polecenie to:seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'
split
działa na wielu plikach linii, a nie na jednym pliku linii lub łańcuchu. W poniższym przykładzie używam,jot
ponieważseq
nie ma w moim systemie. Używam również BSDsed
z dodatkiem, który zmienia marker060
na dwukropek. To produkuje ciąg0102030405:7080910
. Dodajemy060
powrót do drugiego pliku.źródło
jot -w "%02d" 10 1 | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n//g' -e 's/060/:/' | IFS=: read -r one two
daje mi nic jako wyniku. Jaka jest Twoja produkcja na tym etapie? Problem polega na tym, że IFS = ... Mój obecnie w Debianie 8.1read
jest jakiś wariant Linuksa.0102030405:7080910
. Próbuję wkrótce uzyskać OSX w moich palcach. Co-r
robi ta flaga ? Próbuję to zrobić z tym Debianem 8.1.bash
. Po prostu wpiszhelp read
wyjaśnienie.help
. I dostać-r do not allow backslashes to escape any characters
.