A solução do ilkkachu é engenhosa, usa um único executável e é provavelmente a resposta correta. No entanto, nunca consegui resumir os usos avançados de awk
. Se o ilkkachu não tivesse respondido primeiro, eu poderia ter optado por csplit
. csplit
dividirá um arquivo de texto baseado em linhas de contexto (ok, expressões regulares). Você poderia então pegar essa saída e dividir ainda mais os arquivos com o utilitário split
que você já conhece:
$ csplit --prefix="MySplit." test.csv '/^cust header,/' '{*}'
0
174
134
134
Essas são as contagens de bytes de cada parte (que ignoramos neste caso). Agora, iterar sobre cada MySplit
e dividir ainda mais a sua exigência de 20k:
$ for i in MySplit.0*; do
split --additional-suffix=".$i" -l 20000 "$i"
done
Por exemplo, usando -l 2
em vez de 20k, o resultado final dado ao seu exemplo seria (classificado por extensão):
$ ls -lhXB
total 44K
-rw-r--r-- 1 hunteke hunteke 0 Jun 15 13:31 MySplit.00
-rw-r--r-- 1 hunteke hunteke 174 Jun 15 13:31 MySplit.01
-rw-r--r-- 1 hunteke hunteke 67 Jun 15 13:27 xaa.MySplit.01
-rw-r--r-- 1 hunteke hunteke 81 Jun 15 13:27 xab.MySplit.01
-rw-r--r-- 1 hunteke hunteke 26 Jun 15 13:27 xac.MySplit.01
-rw-r--r-- 1 hunteke hunteke 134 Jun 15 13:31 MySplit.02
-rw-r--r-- 1 hunteke hunteke 67 Jun 15 13:27 xaa.MySplit.02
-rw-r--r-- 1 hunteke hunteke 67 Jun 15 13:27 xab.MySplit.02
-rw-r--r-- 1 hunteke hunteke 134 Jun 15 13:31 MySplit.03
-rw-r--r-- 1 hunteke hunteke 67 Jun 15 13:27 xaa.MySplit.03
-rw-r--r-- 1 hunteke hunteke 67 Jun 15 13:27 xab.MySplit.03
-rw-r--r-- 2 hunteke hunteke 442 Jun 15 13:06 test.csv