2010-06-02 8 views
0

J'ai étrange problème avec cut j'ai écrit scénario, là, j'ai rangée:problèmes avec coupe (unix)

... | cut -d" " -f3,4 >! out 

recieves coupe ces données (je l'ai vérifié avec écho)

James    James    033333333 0    0.00 

mais je reçois des lignes vides dans out, quelqu'un peut-il expliquer pourquoi?

Répondre

2

Vous devez compresser les séquences d'espaces, de sorte que e Toute chaîne d'espaces est remplacée par un espace unique. Le tr command's -s (Squeeze) option est parfaite pour cela:

$ ... | tr -s " " | cut -d" " -f3,4 >! out 
0

Couper ne voit pas plusieurs espaces comme espace unique, de sorte qu'il correspond à "vide" entre les espaces.

Vous obtenez des lignes vides lorsque vous laissez >! out partie? C'est-à-dire que vous ciblez des champs corrects?

Si votre chaîne d'entrée utilise un espacement fixe, vous pouvez utiliser cut -c 4-10,15-20 | tr -d ' ' pour extraire des groupes de caractères 4-10 et 15-20 et supprimer les espaces d'eux ..

+0

oui bien sûr, 5 éléments, mais je ne savais pas sur le néant, comment puis-je le changer j'ai besoin de 4ème et 5ème champs? – lego69

+0

Vous pouvez utiliser une autre forme de coupe (voir mon article édité), ou vous pouvez utiliser awk (voir la réponse suivante). –

1

Si vous voulez des champs à partir d'un fichier texte, awk est presque toujours la réponse:

... | awk '{print $3" "$4}' 

Par exemple:

$ echo 'James  James  033333333 0    0.00' | cut -d" " -f3,4 

$ echo 'James  James  033333333 0    0.00' | awk '{print $3" "$4}' 
033333333 0 
+0

oh, je peux le faire sans awk, je ne peux pas l'utiliser, il fait partie de mon projet, je le fais seulement avec couper, grep, trier, uniq, tête, queue – lego69

+0

Aucune de ces commandes ne compresse plusieurs espaces dans un. Êtes-vous sûr qu'il ne s'agit pas d'onglets dans l'entrée? – paxdiablo

+0

oui, je suis sûr, mais encore comment puis-je le faire sans awk, je n'ai pas d'espacement fixe? – lego69

0
... | grep -o "[^ ]*" 

va extraire les champs, chacun sur une ligne séparée. Ensuite, vous pourriez les tête/queue. Je ne suis pas sûr de les remettre sur la même ligne.