2011-08-02 1 views
4

J'ai vu beaucoup de messages posant des questions similaires. Je ne peux pas le faire fonctionner.Analyse de l'entrée délimitée par des tuyaux dans awk

entrée ressemble à:

<field one with spaces>|<field two with spaces> 

Essayer d'analyser avec awk.

ont essayé de nombreuses variantes d'excellents messages:

FS = "^[\x00- ]*|[\x00- ]*[|][\x00- ]*|[\x00- ]*$"; 
FS = "^[\x00- ]*|[\x00- ]*\|[\x00- ]*|[\x00- ]*$"; 
FS = "^[\x00- ]*|[\x00- ]*\\|[\x00- ]*|[\x00- ]*$"; 

ne peut toujours pas obtenir le pipe pour delimiter travailler.

Utilisation de CentOS.

Une aide?

Répondre

14
echo "field one has spaces | field two has spaces" \ 
| awk ' 
    BEGIN { 
     FS="|" 
} 
{ 
    print $2 
    print $1 
    # or what ever you want 
}' 

#output 

    field two has spaces 
    field one has spaces 

Vous pouvez également réduire à

awk -F'|' { 
    print $2 
    print $1 
}' 

Modifier En outre, tous les awks peuvent prendre un regex plusieurs caractères pour la valeur FS.

Edit2 D'une certaine façon je raté cette origine, mais je vois que vous essayez d'inclure \x00 dans les classes char avant et après la | omble chevalier. Je suppose que vous voulez dire pour \x00 == null char? Je ne pense pas que vous serez en mesure d'avoir awk analyser un fichier avec des caractères nuls incorporés. Vous pouvez PREP-rocess votre entrée comme

tr '\x00' ' ' <file.txt> spacesForNulls.txt 

ou les supprimer complètement avec

tr -d '\x00' <file.txt> deletedNulls.txt 

et éliminer cette partie de votre regex. Mais comme ci-dessus, certains awk ne prennent pas en charge regex pour la valeur FS. Et, je n'utilise pas beaucoup l'astuce tr, vous pouvez trouver qu'il nécessite une notation légèrement différente pour le char null, en fonction de votre version de tr.

J'espère que cela aide.

+0

Grand point avec '\ x00'. Ou l'op devrait utiliser un outil plus spécialisé comme 'perl' ou' ruby'. ++ – sjsam

+0

'Je ne pense pas que vous seriez en mesure d'avoir awk analyser un fichier avec des caractères nuls intégrés» Ou une seconde pensée? 'awk '{gsub (" \ x00 "," ")} 1' est possible. – sjsam

Questions connexes