Puxando linhas n para m da lista de arquivos encontrados

1

Em última análise, eu preciso pegar as linhas 3-53 de cada csv em cada subdiretório.

Eu peguei as linhas assim (o gato não é necessariamente obrigatório):

cat /[path]/[file].csv | head -53 | tail -51

E os arquivos como este (mas localize IS):

find /[path]/ -name "*.csv"

O problema é que estou tendo problemas para encadear os dois. Eu poderia listar o que eu tentei para o seu divertimento, mas é obviamente um absurdo. Alguém pode me cutucar na direção certa?

    
por Gary 29.08.2014 / 01:22

3 respostas

4

Tente isto:

find /path/to/file/ -maxdepth 1 -type f -name '*.csv' -print0 | while read -d '' -r file; do sed -n '3,53p' $file; done

Observe a opção print0 , que cuida de quaisquer possíveis caracteres de espaço em branco nos nomes dos arquivos.

    
por 29.08.2014 / 03:00
1

Acho que o seguinte deve ajudá-lo, se eu entendi corretamente.

Script / linha:

$ for csv_files in $(find /home/t1/ -name "*.csv"); do echo $csv_files ; done

Saída:

/home/t1/t4/t4.csv
/home/t1/t1/t1.csv
/home/t1/t2/t2.csv
/home/t1/t3/t3.csv

Em vez do echo , você pode inserir seu segundo comando cat $csv_files | head -53 | tail -51

Por uma questão de conclusão, substituí a linha echo :

$ for csv_files in $(find /home/t1/ -name "*.csv"); do cat $csv_files | head -53 | tail -51; done 
    
por 29.08.2014 / 01:48
1

Você pode conseguir isso usando a própria descoberta

find path -type f -name '*.csv' \
-exec sh -c 'for f; do head -n 53 "$f" | tail -n 51; done' _ {} + 
    
por 29.08.2014 / 02:50