
Tengo una serie de directorios, todos con list.txt
el 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.txt
archivo 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 Name
poner 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 $i
en 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 i
y redirigiendo la salida al archivo de salida en lugar de intentar generar su contenido), si no tiene muchos miles de estos list.txt
archivos:
awk '/^bar[0-9]/ { print $1 }' /home/ubuntu/Project/working/library_*/Results/list.txt >output.txt
Esto se utiliza awk
para extraer la primera columna de todas las líneas que comienzan con la cadena bar
seguida 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.txt
se 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 awk
llamada individual. También tenga en cuenta que awk
detecta fácilmente grep
las líneas deseadas y que cat
no 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 awk
código de /^bar[0-9]/
a FNR > 1
.