Bucle For para iterar sobre el árbol de directorios extrayendo resultados de archivos del mismo nombre

Bucle For para iterar sobre el árbol de directorios extrayendo resultados de archivos del mismo nombre

Tengo una serie de directorios, todos con list.txtel mismo formato, y deseo poner los resultados en un solo archivo. Estoy buscando escribir un script que se mueva iterativamente a través de cada árbol de directorios, extraiga una columna específica del list.txtarchivo sin el texto circundante usando la canalización grep/awk a continuación y escriba las salidas de cada uno en el mismo archivo.

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

Intenté lo siguiente, pero no estoy seguro exactamente de dónde van mal mis bucles en el script.

#!/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

El árbol de directorios es el siguiente:

.
├── 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

Muestra de list.txt, donde solo quiero Nameponer los valoresoutput.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 

La solución fue poner "$i" donde antes solo tenía i y modificarlo para| cat >> ../output.txt

Respuesta1

Está utilizando i, en lugar de este uso $ien el comando grep.

Y dijiste que quieres ponerlos todos en un solo archivo, entonces el último comando debería ser:

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

O solo:

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

Respuesta2

Además de corregir algunos pequeños errores tipográficos en su código original (usando "$i"en lugar de iy redirigiendo la salida al archivo de salida en lugar de intentar generar su contenido), si no tiene muchos miles de estos list.txtarchivos:

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

Esto se utiliza awkpara extraer la primera columna de todas las líneas que comienzan con la cadena barseguida de un dígito. Hace esto para todos los archivos que coincidan con el patrón /home/ubuntu/Project/working/library_*/Results/list.txt. Los datos extraídos se redirigen a output.txt.

El bucle se vuelve necesario cuando el patrón global de nombres de archivos /home/ubuntu/Project/working/library_*/Results/list.txtse expande a demasiados nombres:

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

Tenga en cuenta que es más eficiente redirigir la salida deel lazoque de cada awkllamada individual. También tenga en cuenta que awkdetecta fácilmente greplas líneas deseadas y que catno son necesarias.

Si necesita la primera columna de todas las líneas excepto la primera (como en los datos de ejemplo), puede cambiar la condición en el awkcódigo de /^bar[0-9]/a FNR > 1.

información relacionada