nomeando arquivos de divisão usando o comando split [duplicate]

2

Estou escrevendo um script de shell no qual estou lendo todos os arquivos em um diretório, executando algumas verificações de critério e dividindo certos arquivos no número de registros (linhas)

Eu quero dividir o arquivo abc.txt como abc (AA ou 01) .txt (Eu não me importo com nada desde que comece com abc e termine em .txt)

Existe uma maneira simples de fazer isso?

Estou usando o comando split:

split -l $line_count $file $????   

Estou confuso com o que deveria estar no lugar de ????

Estou aberto a outros métodos também, mas eu prefiro apenas mudar o ??? como as outras partes do script estão prontas.

Muitos agradecimentos

    
por kpython 17.10.2016 / 20:57

1 resposta

2

Tente:

split -l 5 --additional-suffix=.txt abc.txt abc

Ou, se você quiser números no lugar de letras:

split -l 5 -d --additional-suffix=.txt abc.txt abc

O abc que adicionamos depois dos nomes dos arquivos serve como o prefixo .

Como você queria .txt como um sufixo, adicionamos a opção --additional-suffix=.txt .

O opcional -d indica split para usar números em vez de letras.

Exemplo

Vamos começar com um diretório com um arquivo:

$ ls
abc.txt

Agora, vamos dividir esse arquivo:

$ split -l 5 -d --additional-suffix=.txt abc.txt abc
$ ls
abc00.txt  abc01.txt  abc02.txt  abc03.txt  abc.txt

Solução alternativa 1: usando o shell

As versões atuais do GNU split suportam a opção --additional-suffix e split faz parte do GNU coreutils. Isso significa que esta opção estará eventualmente disponível em todos os sistemas linux.

Para os sistemas que atualmente faltam, uma alternativa é renomear os arquivos depois que split os cria. Por exemplo:

$ split -l 5 -d abc.txt abc
$ for f in ./abc??; do mv "$f" "$f.txt"; done
$ ls
abc00.txt  abc01.txt  abc02.txt  abc03.txt  abc.txt

O acima assume que o tamanho padrão do sufixo de 2 se aplica. Caso contrário, altere o número de ? para corresponder ao comprimento do sufixo que você está usando. Por exemplo, se você estiver usando um comprimento de sufixo de 5:

$ split -l 5 -a 5 -d abc.txt abc
$ for f in ./abc?????; do mv "$f" "$f.txt"; done
$ ls
abc00000.txt  abc00001.txt  abc00002.txt  abc00003.txt  abc.txt

Solução alternativa 2: usando o awk

Aqui, a opção l especifica o número de linhas a serem incluídas em cada arquivo dividido e d especifica o número de dígitos a serem usados no nome dos arquivos divididos. Certifique-se de que d seja grande o suficiente.

$ awk -v l=5 -v d=2 '{n="0000" int((NR-1)/l); f="abc" substr(n,length(n)+1-d) ".txt"; if (f!=old) close(old); old=f; print >f}' abc.txt
$ ls
abc00.txt  abc01.txt  abc02.txt  abc03.txt  abc.txt
    
por 17.10.2016 / 21:11