2017-08-29 5 views
0

J'ai un fichier appelé list_of_files.txt qui est une liste de plus de 500 autres fichiers. Il ressemble donc:Bash faisant boucle pour répéter le code plusieurs fois

list1.txt 
list2.txt 
list3.txt 
etc 

Cette liste se ressemblent tous comme ceci: (toutes les colonnes sont faites de valeurs numériques) valeur1 valeur2 valeur3 valeur4 valeur5 valeur6 etc

Pour chacune de ces listes, je veux Pour couper une certaine colonne d'intérêt, triez-la de manière à ce que les nombres soient dans un ordre croissant et vérifiez si mon fichier original et le nouveau ont le même ordre.

J'ai essayé de faire un script comme si .sh boucle:

for i in list_of_files.txt 
do 
cut -f3 -d " " list*.txt > chr*_all_positions.txt 
sort -n chr*_all_positions.txt > chr*_ordered_positions.txt 
diff chr*_all_positions.txt chr*_ordered_positions.txt > result_*.txt 
done  

Cependant, cela ne fonctionne pas. Toute aide serait appréciée.

Répondre

0

Boucle sur les chiffres, pas les noms de fichiers:

i=1 
while [[ -f list$i.txt ]] ; do 
    cut -f3 -d " " list$i.txt > chr$i\_all_positions.txt 
    sort -n chr$i\_all_positions.txt > chr$i\_ordered_positions.txt 
    diff chr$i\_all_positions.txt chr$i\_ordered_positions.txt > result_$i.txt 
    ((i++)) 
done 

, vous pouvez également utiliser sort -c ou sort -C pour vérifier si la sortie est triée sans la nécessité de créer le fichier _ordered.

+0

Merci! Cela marche. Toutefois, si mes fichiers de liste étaient nommés comme suit: list1.1.txt, list1.2.txt, etc Ce code fonctionnerait-il toujours? Cela ne semble pas quand j'essaye. – m93

+0

@ m93: Ajustez simplement le code selon vos besoins. – choroba

+0

Désolé, je suis très nouveau à Bash. J'ai essayé d'ajuster en écrivant i = 1.1 mais j'ai eu une erreur. – m93

0

En utilisant ReadArray et tableau

readarray -t arrname < list_of_files.txt 

for filename in "${arrname[@]}"; do 
    ... 
done 

aide interne read

while read filename; do 
    ... 
done < list_of_files.txt