Encontre e redirecione para capturar o nome do arquivo padrão

1

Estou procurando uma maneira de fazer algo como:

find /path -name "201[2-6]*" | awk -F"/" '{print $5"/"$6"/"$7"/"$8",0,0,0"}' > archives_201.csv

onde archives_201.csv poderia ser archives_201[2-6].csv o resultado da captura do nome do arquivo.

Eu sei que eu poderia fazer por loop ao longo do ano. Porque a pasta pode conter ~ 100 milhões de arquivos, eu deveria evitá-lo.

[EDITAR]

Eu também tentei

 find /path -name "201[2-6]" | awk -F"/" 'BEGIN {print $5"/"$6"/"$7"/"$8",0,0,0" > ${8:0:4}"_export_0504.csv"}' 

mas tem

awk: BEGIN {print $5"/"$6"/"$7"/"$8",0,0,0" > ${8:0:4}"_export_0504.csv"}
awk:                                                                  ^ syntax error
    
por Ali SAID OMAR 05.04.2016 / 14:46

1 resposta

0

Problema 1:

Processe os arquivos residentes em /path , cujo nome começa com 201 , seguido por um único dígito entre 2 e 6 , seguido por qualquer caractere.

Divida cada linha no caractere / e componha uma linha com os campos 5 , 6 , 7 e 8 com / entre eles, seguido por ",0,0,0" string.

Armazene essa linha, e quaisquer outras subseqüentes, em um arquivo chamado de arquivo cujo nome é archives_201 seguido pelo mesmo dígito único encontrado anteriormente no nome do arquivo de entrada, com extensão .csv .

Solução 1:

awk -F/ '
    FNR==1 {match(FILENAME, /\/(201[2-6])/, m)}
    {print $5"/"$6"/"$7"/"$8",0,0,0" >> "archives_"m[1]".csv"}
' /path/201[2-6]*

Comentários:

Como você não fornece arquivos de entrada de amostra e a saída desejada, tive que fazer algumas suposições em vários pontos.

Não tenho ideia do que você está tentando realizar: > ${8:0:4}"_export_0504.csv" .

Piping find resulta em awk deixa-me intrigado: quer que awk leia realmente cada ficheiro ou apenas processe uma lista de texto? Se este último, a composição rígida dos campos ($5"/"$6"/"$7"/"$8) significa que você espera que todos os arquivos estejam no mesmo diretório, então por que usar find ?

Assumi que não há nenhuma parte do caminho, além do nome do arquivo, que comece com a string de pesquisa 201[2-6] . Eu assumi que você deseja adicionar ( >> ) várias linhas ao mesmo arquivo, em vez de sobrescrevê-lo, se necessário ( > ). Eu assumi que todos os arquivos estão no mesmo diretório e eu assumi que awk é para trabalhar em arquivos conteúdos ao invés de em arquivos nomes .

A escolha de / como separador de campos sugere essa última hipótese, então vou tentar resolver esse problema também.

Problema 2:

Processe os nomes dos arquivos residentes em /path , cujo nome começa com 201 , seguido por um único dígito entre 2 e 6 , seguido por qualquer caractere.

Divida cada nome de arquivo no caractere / e componha uma linha com o 5º, 6º, 7º e 8º componentes (preservando o / entre eles), seguido por uma string ",0,0,0" .

Armazene aquela linha, e quaisquer outras subseqüentes, em um arquivo chamado archives_201 seguido pelo mesmo dígito único encontrado anteriormente no nome do arquivo, com a extensão .csv .

Solução 2:

awk -F/ '
    FNR==1 {
        match(FILENAME, /\/(201[2-6])/, m);
        $0=FILENAME;
        print $5"/"$6"/"$7"/"$8",0,0,0" >> "archives_"m[1]".csv"
    }
' /path/201[2-6]*
    
por 19.04.2018 / 12:20

Tags