2010-11-25 4 views
0

J'ai une exigence.Lecture du nombre de paramètres transmis à la variable utilisateur sous UNIX

J'accepte une entrée USER dans une variable en utilisant un script UNIX (ksh).

file_name='po_header*.dat ; po_line*.dat ; po_dist*.dat' 

Quand je fais l'écho,

echo "Data File Names : " $file_name 

je vais obtenir tous les noms de fichiers disponibles à l'emplacement. La sortie sera comme donnée ci-dessous:

po_headers_057.dat
po_headers_123.dat
po_headers_890.dat
po_lines_057.dat
po_lines_123.dat
po_lines_890.dat
po_distribution_057.dat
po_distribution_123 .dat
po_distribution_890.dat

Je dois obtenir le nombre de noms de fichiers transmis à la variable séparés par ';'. Ici, dans ce cas . c'est-à-dire 'po_header * .dat; po_line * .dat; po_dist * .dat '

Comment faire cela?

+0

Toute assistance à ce sujet. – Arun

Répondre

0

une façon:

count=$(echo "$file_name" | awk -F';' '{print NF}') 
echo $count 

Edité - NF retiré $ -> NF

+0

son en me donnant les 3 derniers noms de fichiers comme indiqué ci-dessous. ** 'po_distribution_057.dat po_distribution_123.dat po_distribution_890.dat' ** J'ai besoin du compte comme 3. – Arun

+0

-F spécifie le séparateur de la classe de caractère ou caractère unique qui délimite un champ pour awk. La valeur par défaut est espace blanc - tabulation et espaces. Changez le code ci-dessus pour correspondre à ce que vous voulez. Vous avez initialement donné; comme le séparateur de champ. C'est pourquoi awk -F ';' y a-t-il. –

+0

vous voulez 'imprimer NF' pas' imprimer $ NF' - NF est le nombre de champs; $ NF est la valeur du dernier champ –

0
count=`echo "po_header*.dat ; po_line*.dat ; po_dist*.dat" | \ 
sed 's/;//g' |wc -w|awk '{print $1;}'` 
echo $count 

œuvres pour po_header*.dat ; po_line*.dat ; po_dist*.dat, pour po_header*.dat ;; po_line*.dat ; po_dist*.dat;, et pour « po_header [0-9] .dat; po_line * .dat; po_dist * .dat ". Une alternative de sed est d'utiliser tr ";" " ".

+0

Quand 'wc' lit à partir de stdin, il n'a pas de nom de fichier à imprimer, donc le tuyau dans awk est inutile. Vous pouvez également donner awk le délimiteur avec '-F ';'' comme dans la réponse de @ jim –

+0

@glenn sur mon mac, 'wc' imprime' 3', 'awk' est de laisser' 3' seulement et fonctionne bien si l'entrée est '3'. – khachik

+0

Oui, ça ne fait pas de mal de le laisser là. Mais c'est inutile. –

2

En ksh sans utiliser des utilitaires externes:

saveIFS=$IFS; IFS=';'; a=($file_name); IFS=$saveIFS; echo ${#a[@]} 

En prime, vos filespecs sont maintenant dans un tableau:

$ echo ${a[1]} 
po_line*.dat 
0
IFS=\; read -A a <<< "$file_name"; print ${#a[*]} 

Cela envoie le contenu de nom_fichier $ à la commande read comme entrée standard, avec IFS défini sur; pour la lecture (et seulement la lecture, donc pas besoin de sauvegarder/réinitialiser). -A dit à read de diviser l'entrée sur IFS et de sauvegarder chaque mot dans le tableau nommé (a). $ {# a [*]} donne le nombre d'éléments sauvegardés.

Questions connexes