O jeito Shell Script de resolver problemas – Episódio 3

★ Lista de episódios da série Tela Preta: 1 2 3 4 5 6 7 8 9

Solução fácil.
Um único comando.
split -l N arquivo.txt

Não conhece o comando?
Não conhece esta opção específica?
Problemas², vai ter que inventar.

sed, sempre ele.
sed que gera sed: avançado e poderoso.
paste + seq + seq? Quem diria!

Sem arquivos temporários.
Sem loop.
Sem design patterns.

Com mágica.
Com diversão.
Com salada de frutas.

Spoiler: a Mog dá “oi” tímido no final ;)

Resumo dos comandos:

  • sed — edita linhas
  • seq — sequência de números
  • split — fatia arquivos
  • paste — junta colunas

Histórico:

### split
seq 20
seq 20 > 20.txt
split -l 5 20.txt
ls
cat xaa
cat xab
rm x*
ls

### sed w
sed -n '1,5 p' 20.txt
sed -n '4,11 p' 20.txt
sed -n '4,11 w foo.txt' 20.txt
ls
cat foo.txt
sed -n '1,5 w foo1.txt' 20.txt
sed -n '6,10 w foo2.txt' 20.txt
cat foo2.txt

### paste + seq
seq 5
seq 1 20
seq 1 5 20
seq 5 5 20
seq 1 5 20 > a1
seq 5 5 20 > a2
paste a1 a2
paste a1 <(seq 5 5 20)
paste <(seq 1 5 20) <(seq 5 5 20)
rm a?

### sed constrói um script sed
paste -d , <(seq 1 5 20) <(seq 5 5 20)
paste -d , <(seq 1 5 20) <(seq 5 5 20) | sed 's/.*/& w foo.txt/'
paste -d , <(seq 1 5 20) <(seq 5 5 20) | sed 's/.*/& w foo-&.txt/'
paste -d , <(seq 1 5 20) <(seq 5 5 20) | sed 's/.*/& w linhas-&.txt/'
paste -d , <(seq 1 5 20) <(seq 5 5 20) | sed 's/.*/& w linhas-&.txt/ ; s/,/-/2'

### aplicação do script sed
paste -d , <(seq 1 5 20) <(seq 5 5 20) | sed 's/.*/& w linhas-&.txt/ ; s/,/-/2' > foo.sed
cat foo.sed
ls
ls
sed -n -f foo.sed 20.txt
ls
cat linhas-1-5.txt
cat linhas-16-20.txt

### recapitulando: estes são os dois comandos
paste -d , <(seq 1 5 20) <(seq 5 5 20) | sed 's/.*/& w linhas-&.txt/ ; s/,/-/2' > foo.sed
sed -n -f foo.sed 20.txt

### agora num único comando, sem precisar de foo.sed
rm foo.sed
rm linhas-*
paste -d , <(seq 1 5 20) <(seq 5 5 20) | sed 's/.*/& w linhas-&.txt/ ; s/,/-/2' | sed -n -f - 20.txt
paste -d , <(seq 1 5 20) <(seq 5 5 20) | sed 's/.*/& w linhas-&.txt/ ; s/,/-/2' | sed -n -f /dev/stdin 20.txt
ls
cat linhas-6-10.txt
— EOF —

Gostou desse texto? Aqui tem mais.