Como encontrar arquivos csv específicos e extrair sua segunda linha em um único arquivo csv

0

Estou tentando descobrir como filtrar arquivos csv específicos pelo nome e extrair a segunda linha em um único arquivo csv. Eu não tenho certeza se é uma boa idéia para encontrar arquivos e, em seguida, canalizá-lo com comandos como sed / awk para extrair a linha desejada.

find -name "data.csv" | sed -n 2p > final.csv 

atualizar

Usar um loop for no script bash gera a saída desejada, mas imprime todas as saídas em uma única linha.

for OUTPUT in $(find -name "data.csv")
do

        sed -n 2p $OUTPUT

done

Por favor me ajude com suas sugestões.

    
por encodeflush 01.02.2016 / 17:11

3 respostas

1

Se você observar a saída de find -name "data.csv" , verá que ela imprime os nomes completos dos arquivos chamados data.csv . O pipeline passa isso para sed , que imprime a segunda linha de sua entrada.

Então o que você está dizendo é: "Aqui está uma lista de arquivos. Dê-me o segundo da lista." O que você realmente quer dizer é "Aqui está uma lista de arquivos. Para cada um, me dê a segunda linha". E para isso, você quer usar xargs .

Provavelmente, você precisará de

find -name "data.csv" -print0 | xargs -0 -n 1 sed -n 2p > final.csv

Geralmente, é uma boa ideia usar find -print0 | xargs -0 : o -print0 faz com que find use caracteres NUL como separadores entre nomes de arquivos em vez de uma nova linha e -0 informa xargs a esperar isso. Isso evita que nomes de arquivos com espaços, retornos ou outros caracteres estranhos atrapalhem seu pipeline.

O -n 1 informa xargs para executar um processo sed separado para cada arquivo "data.csv" que encontrar, em vez de tentar agrupá-los em conjunto, o que geralmente torna as coisas mais eficientes. Neste caso, se você executar

sed -n 2p file1 file2 file3

ele internamente concatenará todos os seus arquivos de entrada em um fluxo de entrada e imprimirá a segunda linha dele. Mas RTFM: pode haver uma maneira de fazer sed não fazer isso, que eu perdi.

    
por 01.02.2016 / 17:33
0

O resultado da descoberta é a lista de nomes de arquivos que o sed precisa usar. Portanto, use xargs para executar sed nessa lista, um por um. Mas como nomes de arquivos podem conter espaços e linhas novas, é melhor usar a opção "-print0" de find, para delimitar os nomes dos arquivos com ascii zero. Além disso, quando esses arquivos são grandes, você pode salvar o cpu-heat, parando após a linha 2. E então você começa:

find -name "data.csv" -print0 | xargs -0 -n 1 sed -n -e 2p -e 2q > final.csv
    
por 01.02.2016 / 17:34
0

Você pode fazer o seguinte:

find -name "data.csv" | xargs -n 1 sed -n 2p >> final.csv

Observe acima que usar >> concatena os resultados de sed em final.csv, em uma nova linha, em vez de substituí-los, enquanto > simplesmente substitui o conteúdo em final.csv pela saída de sed.

    
por 01.02.2016 / 17:42

Tags