Copiando um cabeçalho de modelo para vários arquivos existentes

0

Eu tenho um monte de arquivos * .csv que usam cabeçalhos. No momento, os arquivos têm cabeçalhos e o mesmo número de linhas de dados. Preciso apagar os dados desses arquivos, então imaginei que poderia substituir o cabeçalho nos arquivos. Eu tenho o arquivo A configurado corretamente com o cabeçalho. Como posso cat A em todos os outros arquivos csv?

Como posso excluir o último X número de linhas dos arquivos? O caminho para os arquivos é */*.csv

    
por Stuart 12.07.2013 / 22:08

2 respostas

1
  1. Agrupe o cabeçalho em cada um dos arquivos. Estou assumindo que A é um arquivo desde que você mencionou cat . Em caso afirmativo, você pode simplesmente copiar:

    for file in */*.csv; do cp A "$file"; done
    

    Se A for uma variável, faça

    for file in */*.csv; do echo "A" > "$file"; done
    

    Alternativamente, se tudo que você precisa é da primeira linha, você pode colocar isso em cada arquivo. Dessa forma, também funcionará para diferentes cabeçalhos:

    for file in */*.csv; do head -n "$file" > /tmp/foo && 
      mv /tmp/foo "$file"; 
    done
    
  2. Existem muitas maneiras de excluir o último X número de linhas dos arquivos. Aqui estão três:

    • head , altere X para quantas linhas você quiser manter:

      for file in */*.csv; do
        head -n X $file > /tmp/foo && mv /tmp/foo "$file"; 
      done
      
    • awk , altere o 123 para quantas linhas você quiser manter:

      for file in */*.csv; do
        awk 'NR<=123' "$file" > /tmp/foo && mv /tmp/foo "$file"; 
      done
      
    • perl , altere o 123 para quantas linhas você quiser manter:

      for file in */*.csv; do
        perl -ne "next if $.>123;print' "$file" > /tmp/foo && 
        mv /tmp/foo "$file"; 
      done
      
por 17.07.2013 / 04:05
1

Você pode usar sed e alguma criatividade de tubo para converter uma lista de arquivos (ou qualquer coisa) em uma lista de comandos.

Este é um teste, ele apenas mostrará os comandos para você ver o que vai acontecer:

$ ls *.cvs | sed "s/.*/cat headerfile.cvs > &/"

Se você gosta, faça o mesmo e canalize-o para o seu shell favorito:

$ ls *.cvs | sed "s/.*/cat headerfile.cvs > &/" | bash

Ou para uma solução recursiva, você pode usar find:

find . -name \*.cvs | sed "s/.*/cat headerfile.cvs > &/" | bash
    
por 17.07.2013 / 03:43