2009-09-20 6 views
0

Voici le script que je me sers et que cela fonctionne bienComment passer dynamiquement le nom de fichier à awk quand awk est utilisé en substitution de commande pour construire le tableau shell?

# This is a test file which we are creating and this will be used to create the shell array 
cat > test.txt <<End-of-message 
1A|1B|1C|1D 
2A|2B|2C|2D 
3A|3B|3C|3D 
4A|4B|4C|4D 
End-of-message 

set -A col1_arr `awk 'BEGIN { FS = "|" }{print $1}' test.txt` 

i=0 
while [ $i -lt ${#col1_arr[@]} ] 
do 
    echo "Column 1 is:${col1_arr[$i]}" 
    ((i=i+1)) 
done 

rm test.txt # delet the test file 

Je ne veux pas test.txt coder en dur et veulent pouvoir passer comme une variable. S'il vous plaît donnez votre avis.

Répondre

0
set -A col1_arr `awk -v file=$myfile -F '|' \ 
    'END { while (getline < file) print $1 }' /dev/null` 

awk avancera à un nouveau record que lorsque le courant principal d'entrée a un nouveau record. Donc, vous devez faire la boucle manuellement dans un bloc END, et assurez-vous que le script awk atteint le bloc de fin en spécifiant/dev/null comme flux d'entrée principal.

+0

J'ai obtenu un downvote. Downvoter, s'il vous plaît ajouter un commentaire pour me dire ce que vous trouvez incorrect à propos de cette réponse. Peut-être que je peux l'améliorer. –

-1

Il semble que vous essayez de produire la sortie suivante:

Column 1 is: 1A 
Column 1 is: 2A 
Column 1 is: 3A 
Column 1 is: 4A 

Si tel est le cas, on n'a pas besoin que les séries longues et compliquées de commandes. Cela va faire:

awk -F'|' '{print "Column 1 is: " $1}' test.txt 

Si vous voulez continuer à utiliser une variable au lieu du nom de fichier, puis définissez (exemple Bash):

fileName=test.txt 
awk -F'|' '{print "Column 1 is: " $1}' $fileName 
-1

Nous pouvons transmettre le nom de fichier dynamiquement à awk quel que soit d'awk étant utilisé dans la substitution de commande, e. g., si le nom de fichier est le premier argument du script:

... `awk 'BEGIN { FS = "|" }{print $1}' $1` 
Questions connexes