Как использовать флаг -p разделения BSD?

Руководство

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

Код

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

который создает последовательность от 1 до 10, удаляет пустые строки, чтобы получить мегастроку, а затем разбивает на 060два файла, безуспешно давая split: invalid option -- 'p'.

Команда seq -w 1 1 10 | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'в комментарии дает

поле1: 01 поле2: 060 поле1: 02 поле2: 060 поле1: 03 поле2: 060 поле1: 04 поле2: 060 поле1: 05 поле2: 060 поле1: 06 поле2: 060 поле1: 07 поле2: 060 поле1: 08 поле2: 060 поле1: 09 поле 2: 060 поле 1: 10 поле 2: 060

чего я не хочу. Я хочу разделить файл по метке 060на два файла. Вы можете включить 060в любой файл.

Как вы можете использовать флаг -p в BSD Split в OSX?

Тот факт, что вы получаете «недопустимый вариант», предполагает, что вы, возможно, вызываете неправильный файл split. Что which splitвозвращает?
@mjturner Я добавил вывод вашей команды. Да, кажется, что-то не так в моей системе. Мое руководство man splitпосвящено BSD, а мое настоящее split— GNU.
Почему вы не используете обе команды seqи 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}'

Ответы (2)

Проблема вызвана тем, что разделение BSD находится позже на вашем пути, чем разделение GNU (которое не поддерживает эту -pопцию). Если вы сделаете это, echo $PATHвы должны увидеть это - /usr/local/opt/coreutils/libexec/gnubinбудет раньше /usr/binв выводе.

Чтобы напрямую вызвать BSD split, используйте полный путь - pipe to /usr/bin/splitвместо split.

Тогда ваша исходная команда станет:

seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | разделить -p '060'
Как установить PATH и MANPATH согласованными, чтобы команда man splitбыла о splitкоманде?
Если вы хотите, чтобы команды GNU были установлены с префиксом, вам нужно будет их переустановить. Как только это будет сделано, соответствующим образом измените PATH и MANPATH в файлах конфигурации оболочки. Как вы установили команды GNU? У меня есть ощущение, что компилирую вручную - если да, то лучше используйте менеджер пакетов, такой как pkgsrc, MacPorts или Homebrew. Гораздо лучше, чем компилировать из исходников.
Каков ваш выход seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | /usr/bin/split -p '060'? Я получаю только исходную строку. Вообще ничего не раскололось.
@Masi Это задумано. splitразбивает многострочный файл на несколько файлов, используя -pшаблон. Поскольку вы используете только одну строку ввода, это то, что выводится. splitне разделяет совпадающую строку, она использует ее как начало следующего файла. Надеюсь, это имеет смысл!
Да, это имеет смысл. У меня данные в одном мегалайне. Каков вариант разделения на линии? Мне нужно это разделение на строку, потому что некоторый контент может состоять из двух строк, где сопоставление не работает на нескольких строках.
@Masi Вам нужно будет привести нам правильный пример, но с предоставленными данными вы можете сделать следующее вместо передачи по конвейеру split:| awk -F'060' '{print "field1: "$1 "\nfield2: "$2}'
@mjturner, предложенная вами awkкоманда, так сказать, разбивает строку, однако ее вывод отбрасывает «060» (поскольку он установлен в качестве разделителя полей) из строки, и я полагаю, что Маси не хочет, чтобы данные были удалены. Будет ли уместно следующее?awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'
@user3439894 user3439894 Вывод 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не тот, что мне нужен. Я хочу разделить файл по метке 060на два файла. Вы можете включить 060в любой файл.
@Masi, я не знаю, как вы получаете все эти поля, однако следующие команды выводят две строки: одна , 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}'

splitработает с несколькими строковыми файлами, а не с одним строковым файлом или строкой. В приведенном ниже примере я использую, jotпотому что seqэто не в моей системе. Также я использую BSD sedс дополнением, которое меняет маркер 060на двоеточие. Это создает строку 0102030405:7080910. Добавляем 060заднюю часть во второй файл.

    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ничего не дает мне в качестве вывода. Каков ваш результат на этом этапе? Проблема с IFS=... Сейчас у меня в Debian 8.1 readесть вариант для Linux.
Первые две команды дают мне правильно 0102030405:7080910. Я пытаюсь получить OSX в ближайшее время в моих пальцах. Что -rделает этот флаг? Я пытаюсь сделать это с этим Debian 8.1.
Я предполагаю, что вы используете bash. Просто введите help readдля объяснения.
Спасибо! Я этого не знал help. я получаю -r do not allow backslashes to escape any characters.