shantanuo
shantanuo

Reputation: 32296

Splitting file based on variable

I have a file with several lines of the following:

DELIMITER ;

I want to create a separate file for each of these sections. The man page of split command does not seem to have such option.

Upvotes: 1

Views: 434

Answers (1)

migu
migu

Reputation: 1391

The split command only splits a file into blocks of equal size (maybe except for the last one).
However, awk is perfect for your type of problem. Here's a solution example.

Sample input

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;
  }
}

As pointed out by glenn jackman, the code also can be written as:

#!/usr/bin/awk -f
BEGIN {
  n = 1;
}
$0 ~ /DELIMITER ;/ {
  n++;
  next;
}
{
  print $0 >> FILENAME n;
}

The notation on the command prompt awk -v x="DELIMITER ;" -v n=1 '$0 ~ x {n++; next} {print > FILENAME n}' is more suitable if you don't use the script more often, however you can also save it in a file as well.

Test run

$ 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

The script is just a starting point. You probably have to adapt it to your personal needs and environment.

Upvotes: 3

Related Questions