I have one file with -|
as delimiter after each section...need to create separate files for each section using unix.
example of input file
wertretr ewretrtret 1212132323 000232 -| ereteertetet 232434234 erewesdfsfsfs 0234342343 -| jdhg3875jdfsgfd sjdhfdbfjds 347674657435 -|
Expected result in File 1
wertretr ewretrtret 1212132323 000232 -|
Expected result in File 2
ereteertetet 232434234 erewesdfsfsfs 0234342343 -|
Expected result in File 3
jdhg3875jdfsgfd sjdhfdbfjds 347674657435 -|
A one liner, no programming. (except the regexp etc.)
csplit --digits=2 --quiet --prefix=outfile infile "/-|/+1" "{*}"
tested on: csplit (GNU coreutils) 8.30
"For OS X users, note that the version of csplit
that comes with the OS doesn't work. You'll want the version in coreutils (installable via Homebrew), which is called gcsplit
." — @Danial
"Just to add, you can get the version for OS X to work (at least with High Sierra). You just need to tweak the args a bit csplit -k -f=outfile infile "/-\|/+1" "{3}"
. Features that don't seem to work are the "{*}"
, I had to be specific on the number of separators, and needed to add -k
to avoid it deleting all outfiles if it can't find a final separator. Also if you want --digits
, you need to use -n
instead." — @Pebbl
awk '{f="file" NR; print $0 " -|"> f}' RS='-\\|' input-file
Explanation (edited):
RS
is the record separator, and this solution uses a gnu awk extension which allows it to be more than one character. NR
is the record number.
The print statement prints a record followed by " -|"
into a file that contains the record number in its name.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With