Команда split разбивает файл только на блоки одинакового размера (возможно, за исключением последнего).
Однако awk идеально подходит для вашего типа проблемы.Вот пример решения.
Пример ввода
1
2
3
DELIMITER ;
4
5
6
7
DELIMITER ;
8
9
10
11
awk script split.awk
#!/usr/bin/awk -f
BEGIN {
n = 1;
outfile = n;
}
{
# FILENAME is undefined inside the BEGIN block
if (outfile == n) {
outfile = FILENAME n;
}
if ($0 ~ /DELIMITER ;/) {
n++;
outfile = FILENAME n;
} else {
print $0 >> outfile;
}
}
Как указал Гленн Джекман, код также можно записать как:
#!/usr/bin/awk -f
BEGIN {
n = 1;
}
$0 ~ /DELIMITER ;/ {
n++;
next;
}
{
print $0 >> FILENAME n;
}
Обозначения в командной строке awk -v x="DELIMITER ;" -v n=1 '$0 ~ x {n++; next} {print > FILENAME n}'
больше подходят, если вы не используете сценарий чаще, но вы также можете сохранить его в файле.
Тестовый прогон
$ ls input*
input
$ chmod +x split.awk
$ ./split.awk input
$ ls input*
input input1 input2 input3
$ cat input1
1
2
3
$ cat input2
4
5
6
7
$ cat input3
8
9
10
11
Скрипт - это только отправная точка.Возможно, вам придется адаптировать его к вашим личным потребностям и условиям.