Come utilizzare il flag -p della divisione BSD?

1

Manuale

-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.

Codice

seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | split -p '060'

che crea una sequenza da 1 a 10, rimuove le linee vuote per avere un megastring e quindi divide a 060 in due file che non danno un risultato positivo con split: invalid option -- 'p' .

Comando seq -w 1 1 10 | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}' nel commento dà

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

che non è quello che voglio. Voglio dividere il file sul contrassegno 060 su due file. Puoi includere 060 in entrambi i file.

Come si può usare il flag -p in BSD Split in OSX?

    
posta Léo Léopold Hertz 준영 06.07.2015 - 10:34
fonte

2 risposte

2

Il problema è causato dalla divisione di BSD che si trova più avanti nel percorso rispetto alla divisione GNU (che non supporta l'opzione -p ). Se fai un echo $PATH dovresti vedere questo - /usr/local/opt/coreutils/libexec/gnubin sarà prima di /usr/bin nell'output.

Per chiamare direttamente BSD split, usa il percorso completo - pipe to /usr/bin/split invece di split .

Il tuo comando originale diventerà quindi:

seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | split -p '060'
    
risposta data 06.07.2015 - 11:08
fonte
1

split opera su più file di linea non su un singolo file o stringa. Nell'esempio seguente sto usando jot perché seq non è nel mio sistema. Inoltre sto usando BSD sed con un'aggiunta che cambia l'indicatore 060 in due punti. Questo produce la stringa 0102030405:7080910 . Aggiungiamo 060 al secondo file.

    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
    
risposta data 17.07.2015 - 22:04
fonte

Leggi altre domande sui tag