N'utilisez pas de substitution de commande simple pour obtenir les noms de fichiers (qui pourraient facilement rompre avec les espaces et autres caractères spéciaux). Utilisez quelque chose comme xargs
:
xargs -d '\n' -a list_of_files.txt cat > all_compounds.sdf
Ou une while read
boucle:
while IFS= read -r file; do cat "$file"; done < list_of_files.txt > all_compounds.sdf
Pour utiliser la substitution de commandes en toute sécurité, définissez au moins IFS
uniquement la nouvelle ligne et désactivez la globalisation (expansion avec caractères génériques):
(set -f; IFS=$'\n'; cat $(cat list_of_files.txt) > all_compounds.sdf)
Les parenthèses environnantes ()
doivent exécuter ceci dans un sous-shell, afin que votre shell actuel ne soit pas affecté par ces changements.
"$(cat list_of_files.txt)"
cat
obtient alors la liste entière en un seul argument.Bien que GNU
awk
soit un utilitaire de traitement de texte, il permet d'exécuter des commandes shell externes viasystem()
appel. Nous pouvons utiliser cela à notre avantage comme ceci:L'idée ici est simple: nous lisons le fichier ligne par ligne, et à partir de chaque ligne, nous créons une chaîne formatée
cat "File name.txt"
, qui est ensuite passée àsystem()
.Et le voici en action:
Nous avons donc déjà fait la majeure partie de la tâche - nous avons imprimé tous les fichiers de la liste. Le reste est simple: redirigez la sortie finale vers le fichier avec l'
>
opérateur dans le fichier récapitulatif.la source