2010-01-06 5 views
2

J'essaie d'écrire un script qui analyse les champs du programme et les imprime en sortie standard.echo suppression des barres obliques inverses

données du fichier d'entrée est comme ce

field1 field2

Les champs sont séparés par des onglets

Dans un premier temps, j'ai essayé de l'écrire dans AWK.

cat test.txt | while read line; do entity=`awk -F "\t" '{print $2}'`;echo $entity; done 

Cela fonctionne très bien sur la ligne de commande.

Mais lorsque je tente de faire la même chose dans un programme shell comme ci-dessous

while read line 
do 
     entity=`echo $line|awk -F \t '{print $2}'` 
     echo $entity 
done<"test.txt" 

Raison d'être l'écho ligne $ imprime en fait onglets espaces. Je ne peux pas utiliser d'espaces car les champs peuvent contenir des espaces.

Puis j'ai essayé d'écrire en utilisant cut.

while read line 
do 
     entity=`echo $line|cut -f5` 
     echo $entity 
done<"test.txt" 

Encore le même problème avec l'écho.

Avez-vous rencontré un problème similaire? Toute solution que vous pouvez me recommander.

Merci. Bala

+0

afficher les données de l'échantillon réel et ce que vous voulez faire. décrire votre sortie – ghostdog74

Répondre

2

avec des informations limitées, essayez cette

while read -r line 
do 
     entity=$(echo "$line"|cut -f5) 
     echo "$entity" 
done<"test.txt" 
+0

Cela a fonctionné pour moi .. merci. – Boolean

4

Lorsque vous avez une variable avec des onglets et essayez ensuite de faire écho la variable:

line=$'f1\tf2\tf3' 
echo ${line} 

Ce qui se passe est que le shell traite les onglets comme séparateurs d'arguments et de donner écho plusieurs arguments. echo lui-même ne voit jamais les onglets

Si vous souhaitez conserver les onglets, vous devez voir la ligne comme un argument unique. Afin de le faire et d'élargir encore la variable, vous devez entourer la variable avec des guillemets doubles:

echo "${line}" 

Cela va maintenant envoyer un seul argument qui a des onglets en elle.

Cela signifie que vous devez écrire votre script comme ceci:

while read line; do 
    entity=$(echo "$line" | awk -F \t '{print $2}') 
    echo $entity 
done < test.txt 
+0

En fait, j'ai essayé cela, mais seulement après l'option -r pour lire cela a fonctionné .. Comme le texte doit être brut. – Boolean

Questions connexes