For loop para iterar na árvore de diretórios extraindo resultados de arquivos de mesmo nome

For loop para iterar na árvore de diretórios extraindo resultados de arquivos de mesmo nome

Tenho uma série de diretórios, todos list.txtno mesmo formato, e desejo colocar os resultados em um único arquivo. Estou procurando escrever um script que se mova iterativamente por cada árvore de diretório, extraia uma coluna específica do list.txtarquivo sem texto ao redor usando o pipeline grep/awk abaixo e grave as saídas de cada um no mesmo arquivo.

    grep 'bar[0-9]' file.txt | awk '{print $1}'

Eu tentei o seguinte, mas não tenho certeza exatamente onde meus loops no script estão errados.

#!/bin/bash
##Extract ligands from toplist and concatenate to file
for i in /home/ubuntu/Project/working/library_*/Results/list.txt
do
    grep 'bar[0-9]' i | awk '{print $1}' | cat ../output.txt i
done

A árvore de diretórios é a seguinte:

.
├── library_1-200
│   ├── Results
│   │   ├── complex
│   │   ├── sorted.txt
│   │   └── list.txt
│   ├── files
│   │   ├── output
│   │   └── txt
│   └── summary.txt
├── library_201-400
│   ├── Results
│   │   ├── complex
│   │   ├── sorted.txt
│   │   └── list.txt
│   ├── files
│   │   ├── output
│   │   └── txt
│   └── summary.txt
├── library_401-600
│   ├── Results
│   │   ├── complex
│   │   ├── sorted.txt
│   │   └── list.txt
│   ├── files
│   │   ├── output
│   │   └── txt
│   └── summary.txt
└── library_601-800
    ├── Results
    │   ├── complex
    │   ├── sorted.txt
    │   └── list.txt
    ├── files
    │   ├── output
    │   └── txt
    └── summary.txt

Amostra de list.txt, onde eu só quero que os Namevalores sejam colocadosoutput.txt

Name    Score
bar65    -7.8 
bar74    -7.5 
bar14    -7.5 
bar43    -7.4 
bar94    -7.4 
bar16    -7.4 
bar12    -7.3 
bar25    -7.3 
bar65    -7.3 
bar76    -7.3 
bar24    -7.3 
bar13    -7.3 
bar58    -7.2 
bar68    -7.2 
bar28    -7.2 

A solução foi colocar "$i" onde eu tinha anteriormente apenas i e modificar para| cat >> ../output.txt

Responder1

Você está usando i, em vez disso, use $ino comando grep.

E você disse que deseja colocar todos eles em um único arquivo, então o último comando deve ser:

cat >> /home/ubuntu/Project/working/output.txt

Ou apenas:

>> /home/ubuntu/Project/working/output.txt

Responder2

Além de corrigir alguns pequenos erros de digitação em seu código original (usando "$i"e iredirecionando a saída para o arquivo de saída em vez de tentar gerar seu conteúdo), se você não tiver milhares desses list.txtarquivos:

awk '/^bar[0-9]/ { print $1 }' /home/ubuntu/Project/working/library_*/Results/list.txt >output.txt

Isso é usado awkpara extrair a primeira coluna de todas as linhas que começam com a string barseguida por um dígito. Isso é feito para todos os arquivos que correspondem ao padrão /home/ubuntu/Project/working/library_*/Results/list.txt. Os dados extraídos são redirecionados para output.txt.

O loop se torna necessário quando o padrão globbing do nome do arquivo /home/ubuntu/Project/working/library_*/Results/list.txtse expande para muitos nomes:

for pathname in /home/ubuntu/Project/working/library_*/Results/list.txt; do
    awk '/^bar/ { print $1 }' "$pathname"
done >output.txt

Observe que é mais eficiente redirecionar a saída deo laçodo que de cada chamada individual awk. Observe também que awkfaz facilmente o trabalho de grepdetectar as linhas desejadas e isso catnão é necessário.

Se você precisar da primeira coluna de todas as linhas, exceto a primeira (como nos dados de exemplo), poderá alterar a condição no awkcódigo de /^bar[0-9]/para FNR > 1.

informação relacionada