Iterando através de subdiretórios e obtendo dois arquivos como argumentos para o script awk

3

Eu preciso percorrer os subdiretórios de um diretório e pegar dois dos arquivos, como argumentos de um script awk. O script irá comparar os dois arquivos e gerar outros arquivos.

Eu tenho isso. Mas eu preciso do script awk para tomar como arquivos de argumento. ". * 1.txt" e ". * 2.txt"

for i in words/*/*1.txt words/*/*2.txt
do 
awk -f corpus_vs_flexion.awk "$i"
done

Algo como:

awk -f corpus_vs_flexion.awk .*1.txt .*2.txt
# Taking them from each subdirectory in words/* 

Directory words/
               subdirectory Peter/
                                 whatever.txt
                                 whatever1.txt
                                 whatever.txt
                                 whatever.txt
                                 whatever2.txt
               subdirectory Blas/
                                 whatever1.txt
                                 whatever.txt
                                 whatever.txt
                                 whatever.txt
                                 whatever2.txt
               ........./
                                 .....
                                 ..
For each subdirectory loop: awk -f corpus_vs_flexion.awk whatever1.txt whatever2.txt
    
por Firefly 29.02.2016 / 09:16

4 respostas

4

Ok, com nomes de arquivo ocorrendo em pares correspondentes, você pode usar o seguinte:

for f in words/*/*1.txt ; do awk -f corpus_vs_flexion.awk "$f" "${f%1.txt}2.txt" ; done

A frase "${f%1.txt}2.txt" diz "use o nome do arquivo de "$f" , mas remova a finalização 1.txt e adicione a finalização 2.txt ".

    
por 29.02.2016 / 09:30
2

Eu tenho lido um livro e encontrei o que eu precisava!

typ1_files=(words/*/*1.txt)
typ2_files=(words/*/*2.txt)

for ((i=0;i<=${#typ1_files[@]};i++)); do
   awk -f corpus_vs_flexion.awk "${typ1_files[i]}" "${typ2_files[i]}"
done
    
por 29.02.2016 / 10:49
0

Se você pode ter certeza de que sua pesquisa de arquivos é exaustiva e não corresponde a outros arquivos, simplifique perdendo o loop for e apenas use uma substituição de comando com find .

awk -f corpus_vs_flexion.awk $(find /path/to/your/dir -name "*.txt" -type f | tr '\n' ' ')
                                    ^^^^^^^^^^^^^^^^^ Put your dir here
    
por 29.02.2016 / 09:30
0

Eu gosto da resposta de Ralph. Isso também pode funcionar (não testado)

find. -name '*[12].txt' -print0 | xargs -0 -n 2 awk '...'
    
por 29.02.2016 / 12:23