Разделение файла на основе переменной - PullRequest
1 голос
/ 13 августа 2011

У меня есть файл с несколькими строками следующего содержания:

DELIMITER ;

Я хочу создать отдельный файл для каждого из этих разделов.Похоже, что на странице man команды split нет такой опции.

1 Ответ

3 голосов
/ 13 августа 2011

Команда 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

Скрипт - это только отправная точка.Возможно, вам придется адаптировать его к вашим личным потребностям и условиям.

...