Como anexar vários arquivos .txt a um arquivo sem linha de cabeçalho

0

Eu tenho 100.000 arquivos .txt com o formato abaixo:

bygrp,colnum,beta
100005,1,0.629519434191718
100005,2,-0.500000000026516
100005,3,0.560850895321124
100005,4,0.119624318119292
100005,5,0.257676682753309

E os nomes dos arquivos são Job19_beta1.txt, ..., job19_beta100000.txt

Eu criei o total.txt que inclui apenas a linha de cabeçalho: bygrp, colnum, beta.

Eu quero acrescentar apenas a terceira linha (colnum = 2 na tabela) dos 100.000 arquivos para o total.txt, sem cabeçalho.

Como posso escrever um script para fazer isso? Eu acho que preciso escrever para ... fazer ... loop e depois copiar, mas não consigo descobrir ...

Na verdade, sou um analista do SAS, mas tenho um projeto que é necessário para usar o prompt de comando para fazer upload de dados. Eu pesquisei muitos códigos no Google, mas ainda estou lutando com o script. Obrigado antecipadamente!

    
por Syl01via11 29.06.2015 / 02:02

3 respostas

0

Para ler os nomes dos arquivos de um arquivo:

while IFS= read -r filename; do
    sed 1d "$filename"
done < a.txt >> total.txt

Mais eficiente, pois você não precisa invocar o sed para cada arquivo:

xargs awk 'FNR != 1' < a.txt >> total.txt

Isso acumulará tantos argumentos de arquivo para o awk quanto o comando puder manter.

    
por 29.06.2015 / 03:37
0

Testando no bash no linux (não pode garantir janelas), isso parece promissor:

for i in (*.txt)
do
tail -n +2 "$i" >> total.txt
done

O -n +2 para tail produz a segunda linha, pulando apenas a primeira linha.

Ou lendo da sua lista de arquivos em a.txt (provavelmente uso supérfluo de cat, e se não houver novas linhas nos nomes dos arquivos):

for i in $(cat a.txt)
do
tail -n +2 "$i" >> total.txt
done

Ou usar find deve funcionar também, provavelmente mais fácil se os 100.000 arquivos de texto estiverem na mesma árvore de pastas & você precisa fazer alguma escavação.

find folder/ -name "*.txt" -exec tail -n +2 '{}' >> total.txt  \;
    
por 29.06.2015 / 03:37
0

I want to append all the data from the 100,000 files to total.txt but without header since it already exists in total.txt

Nesse caso, e usando ferramentas de estilo bash e unix:

tail -qn +2 job19_beta{1..100000}.txt >>total.txt

Como funciona

  • job19_beta{1..100000}.txt expande para a lista de arquivos que você deseja na ordem correta .

  • tail -qn +2 job19_beta{1..100000}.txt

    Isso grava para stdout o conteúdo de todos os arquivos, começando pela linha 2.

    -n +2 informa tail para iniciar com a linha 2. -q diz tail para ficar quieto e não imprimir cabeçalhos ao alterar arquivos.

  • >>total.txt

    Isso faz com que a saída do comando tail seja anexada a total.txt .

Alternativa usando a.txt

Se você quiser ler os nomes dos arquivos em a.txt , então:

while IFS= read -r fname; do tail -n +2 "$fname"; done <a.txt >>total.txt

Você não mencionou como os nomes dos arquivos são separados em a.txt , então presumi que fossem um por linha. (Observe que é possível que os nomes de arquivos contenham novas linhas em seus nomes, portanto, essa não é uma solução geral.)

    
por 29.06.2015 / 03:37