Jak korzystać z flagi -p podziału BSD?

1

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 060dwa 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 060na dwa pliki. Możesz dołączyć 060do dowolnego pliku.

Jak używać flagi -p w BSD Split w OSX?

Léo Léopold Hertz 준영
źródło
1
Fakt, że pojawia się „nieprawidłowa opcja” sugeruje, że możesz nie dzwonić poprawnie split. Co which splitzwraca
mjturner,
@mjturner Dodałem dane wyjściowe polecenia. Tak, wydaje się, że coś jest nie tak z moim systemem. Mój podręcznik man splitdotyczy BSD, podczas gdy mój fakt splitdotyczy GNU.
Léo Léopold Hertz
Czemu nie używając zarówno seqi gsedpoleceń podczas podstawiając awkza split? Następujące dane wyjściowe poleceń to dwa wiersze, jeden jest, field1: 0102030405a drugi jest field2: 0607080910. Polecenie to:seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'
user3439894

Odpowiedzi:

2

Problem jest spowodowany tym, że podział BSD jest później na twojej ścieżce niż podział GNU (który nie obsługuje tej -popcji). Jeśli to zrobisz echo $PATH, powinieneś to zobaczyć - /usr/local/opt/coreutils/libexec/gnubinbędzie przed /usr/binwyjściem.

Aby bezpośrednio wywołać split BSD, użyj pełnej ścieżki - potok do /usr/bin/splitzamiast split.

Twoje oryginalne polecenie stanie się wtedy:

seq -w 1 1 10 | gsed ': a; N; $! ba; s / \ n // g' | split -p '060'
mjturner
źródło
Jak ustawić PATH i MANPATH tak, aby polecenie man splitdotyczyło splitpolecenia?
Léo Léopold Hertz
Jeśli chcesz, aby polecenia GNU były instalowane z prefiksem, musisz je ponownie zainstalować. Kiedy to zrobisz, zmień odpowiednio PATH i MANPATH w plikach konfiguracyjnych powłoki. Jak zainstalowałeś polecenia GNU? Mam wrażenie, kompilując ręcznie - jeśli tak, to raczej użyj menedżera pakietów, takiego jak pkgsrc, MacPorts lub Homebrew. Znacznie lepiej niż kompilowanie ze źródła.
mjturner,
1
@Masi To z założenia. splitdzieli plik z wieloma wierszami na wiele plików, używając -pwzorca. Ponieważ używasz tylko jednego wiersza danych wejściowych, to jest wynik. splitnie dzieli pasującej linii, używa go jako początku następnego pliku. Mam nadzieję, że to ma sens!
mjturner,
1
@mjturner, Twoje proponowane awkpolecenie 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}'
user3439894,
1
@Masi, nie wiem, w jaki sposób otrzymujesz wszystkie te pola, jednak następujące polecenia są dwiema liniami, jedna jest, field1: 0102030405a druga jest field2: 0607080910. Polecenie to:seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'
user3439894
1

splitdziała na wielu plikach linii, a nie na jednym pliku linii lub łańcuchu. W poniższym przykładzie używam, jotponieważ seqnie ma w moim systemie. Używam również BSD sedz dodatkiem, który zmienia marker 060na dwukropek. To produkuje ciąg 0102030405:7080910. Dodajemy 060powrót do drugiego pliku.

    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
fd0
źródło
To nie jot -w "%02d" 10 1 | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n//g' -e 's/060/:/' | IFS=: read -r one twodaje mi nic jako wyniku. Jaka jest Twoja produkcja na tym etapie? Problem polega na tym, że IFS = ... Mój obecnie w Debianie 8.1 readjest jakiś wariant Linuksa.
Léo Léopold Hertz
Pierwsze dwa polecenia dają mi poprawnie 0102030405:7080910. Próbuję wkrótce uzyskać OSX w moich palcach. Co -rrobi ta flaga ? Próbuję to zrobić z tym Debianem 8.1.
Léo Léopold Hertz -
1
Zakładam, że używasz bash. Po prostu wpisz help readwyjaśnienie.
fd0,
Dziękuję Ci! Nie wiedziałem tego help. I dostać -r do not allow backslashes to escape any characters.
Léo Léopold Hertz