
Tenho uma série de diretórios, todos list.txt
no 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.txt
arquivo 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 Name
valores 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 $i
no 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 i
redirecionando 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.txt
arquivos:
awk '/^bar[0-9]/ { print $1 }' /home/ubuntu/Project/working/library_*/Results/list.txt >output.txt
Isso é usado awk
para extrair a primeira coluna de todas as linhas que começam com a string bar
seguida 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.txt
se 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 awk
faz facilmente o trabalho de grep
detectar as linhas desejadas e isso cat
nã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 awk
código de /^bar[0-9]/
para FNR > 1
.