Tenho certeza de que existe um comando awk
que pode fazer isso, não tenho a habilidade necessária em awk
para criar uma solução. Enquanto isso, você poderia usar algo assim:
#!/bin/bash
csplit -z tosplit /661/ {*}
for file in xx*; do
newName=$(egrep -o '2[0-9]{7}' $file)
mv $file $newName.txt
done
rm -rf xx*
Onde tosplit
é esse arquivo (seu arquivo de exemplo):
661###############20160315###
###########################
###########################
661###############20160316###
###########################
661###############20160317###
###########################
Depois de executar este script (no mesmo diretório que o arquivo tosplit
) eu recebo três arquivos:
ls 2016031*
20160315.txt 20160316.txt 20160317.txt
... assim:
cat 20160315.txt
661###############20160315###
###########################
###########################
cat 20160316.txt
661###############20160316###
###########################
cat 20160317.txt
661###############20160317###
###########################
Você pode possivelmente (?) usar csplit
para nomear os arquivos também, mas isso também está acima do meu nível de pagamento!