2017-06-12 1 views
-1

J'essaie de créer des fichiers avec un ID et sa Date respective. Je veux utiliser des éléments de tableau pour définir le nom de ces fichiers. Le problème est que le résultat n'est pas ce que j'attends lors de la création des fichiers. J'apprécierais votre aide.Création de fichiers en utilisant des éléments de tableau en tant que noms de fichiers

sortie souhaitée:

Je veux créer des fichiers sur le format suivant:

FILE_300002_20170515.txt 
FILE_500032_20170426.txt 
FILE_400044_20170101.txt 

Sortie courant:

FILE_300002_400044.txt 
FILE_300002_300002.txt 
FILE_300002_500032.txt 

Exemple de fichier:

Ceci est le contenu de mon fichier d'entrée:

300002,20170515,500032,20170426,400044,20170101 

Mon code:

IFS=',' read -r -a array <<< "$input" 

ini=1 
ID=0 
Da=1 
num="${#array[@]}" 
let num=num/2 

while [ $ini -le $num ];do 
touch "/path/FILE_${array[Da]}_${array[ID]}.txt" 
let ini=ini+1 
let Da=Da+2 
let ID=ID+2 
done 

**** J'ai remarqué que en utilisant seulement '/path/FILE_${array[ID]}.txt' sur le nom du, affiche toutes les ID corrects, mais lors de l'utilisation des deux, '/path/FILE_${array[Da]}_${array[ID]}.txt' est foiré

+0

Variable 'Da' vs index' DA'. – ArturFH

+0

Merci pour l'observation Artur, j'ai oublié de changer la variable en la copiant sur le corps. De toute façon, le problème persiste. –

+0

Pourriez-vous, s'il vous plaît, coller la sortie actuelle après ces corrections? – ArturFH

Répondre

2

Pourrait le faire comme ceci

IFS=',' read -r -a array <<< "$input" 

for((i=0;i<${#array[@]}-1;i+=2));do 

    touch "/path/FILE_${array[i]}_${array[i+1]}.txt" 

done 
+0

Les indices de tableau sont déjà évalués dans un contexte arithmétique; '$ {tableau [i]}' et '$ {tableau [i + 1]}' sont suffisants. – chepner

+1

Il en va de même pour la boucle 'for':' pour ((i = 0; i <$ {# tableau [@]} - 1; i + = 2)) '. – chepner

+0

@chepner Ouais, je ne sais pas pourquoi je l'ai fait dans la boucle, mais en ce qui concerne les indices de tableau, je ne suis pas à 100%, mais presque sûr qu'ils ne fonctionnent pas comme ça dans les anciens bashes. – 123

1

awk approche alternative:

awk -F, '{ for(i=1;i<=NF;i+=2) if($i!="") system("touch FILE_"$i"_"$(i+1)".txt") }' input 

Vérifiez résultat:

> ls -1 FILE_* 
FILE_300002_20170515.txt 
FILE_400044_20170101.txt 
FILE_500032_20170426.txt 

  • system(command) - Exécuter la commande du système d'exploitation Commande
+0

Cette solution répond aussi à mes attentes, ça marche!" @Roman "et @ 123 vous avez vraiment aidé moi tellement, vous êtes un génie! –