Руководство
-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?
Проблема вызвана тем, что разделение 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'
man split
была о split
команде?seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | /usr/bin/split -p '060'
? Я получаю только исходную строку. Вообще ничего не раскололось.split
разбивает многострочный файл на несколько файлов, используя -p
шаблон. Поскольку вы используете только одну строку ввода, это то, что выводится. split
не разделяет совпадающую строку, она использует ее как начало следующего файла. Надеюсь, это имеет смысл!split
:| awk -F'060' '{print "field1: "$1 "\nfield2: "$2}'
awk
команда, так сказать, разбивает строку, однако ее вывод отбрасывает «060» (поскольку он установлен в качестве разделителя полей) из строки, и я полагаю, что Маси не хочет, чтобы данные были удалены. Будет ли уместно следующее?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
не тот, что мне нужен. Я хочу разделить файл по метке 060
на два файла. Вы можете включить 060
в любой файл.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
.
Мьютернер
split
. Чтоwhich split
возвращает?Лео Леопольд Герц 준영
man split
посвящено BSD, а мое настоящееsplit
— GNU.пользователь3439894
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}'