2010-04-19 12 views
1

Ceci est une ligne du fichier d'entrée:Comment une sous-chaîne dans awk

FOO BAR 0,40 0,20 0,40 0,50 0,60 0,80 0,50 0,50 0,50 -43,00 100010101101110101000111010

Et une commande awk qui vérifie une certaine position si elle est un « 1 » ou « 0 » à la colonne 13 Quelque chose comme:

awk -v values="${values}" '{if (substr($13,1,1)==1) printf values,$1,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13}' foo.txt > bar.txt 

les valeurs des œuvres variables, mais je veux juste dans l'exemple ci-dessus pour vérifier si le premier bit si elle est égal à « 1 ".

EDIT

Ok, donc je suppose que je ne suis pas très clair dans ma question. Le "$ 13" dans la méthode substr est en fait la chaîne de bits. Donc, cet awk veut passer toutes les lignes dans foo.txt qui ont un "1" à la position "1" de la chaîne de bits à la colonne "$ 13". J'espère que cela clarifie les choses.

EDIT 2

Ok, laissez-moi le décomposer vraiment facile. Le code ci-dessus sont des exemples, donc la ligne d'entrée est l'une des nombreuses lignes. Donc, toutes les lignes n'ont pas de 1 à la position 8. J'ai vérifié pour voir si une certaine position a deux occurrences, de sorte que dans tous les cas, je devrais obtenir une sortie. Chose est que dans toutes les lignes il ne trouve pas de "1" sur les posistions que je choisis, mais quand je dis qu'il doit trouver un "0" alors il me renvoie toutes les lignes.

+0

Votre commande awk fonctionne pour moi en fonction de vos besoins édités. Comment ça ne marche pas pour toi? Y a-t-il des champs après le 13? Sinon vous pouvez imprimer $ 0 qui est la ligne entière ('valeurs printf, $ 0') –

+0

Je pourrais utiliser $ 0, sinon pour le fait que j'ai exclu $ 2 exprès. Donc, la séquence est $ 1, $ 3, $ 4 etc. Je veux pouvoir dire: si la huitième position de la chaîne de bits (la 13ème colonne dans chaque ligne de foo.txt) est égale à "1", ajoutez cette ligne à la barre .txt – lugte098

+0

Oups, j'ai manqué le $ 2 manquant. Que obtenez-vous si vous utilisez 'if (substr ($ 13,8,1) == 1) printf ...'? Cela devrait fonctionner. –

Répondre

2
$ cat file 
FOO BAR 0.40 0.20 0.40 0.50 0.60 0.80 0.50 0.50 0.50 -43.00 100010101101110101000111010 
FOO BAR 0.40 0.20 0.40 0.50 0.60 0.80 1.50 1.50 1.50 -42.00 100010111101110101000111010 

$ awk 'substr($13,8,1)==1{ print "1->"$0 } substr($13,8,1)==0{ print "0->"$0 }' file 
0->FOO BAR 0.40 0.20 0.40 0.50 0.60 0.80 0.50 0.50 0.50 -43.00 100010101101110101000111010 
1->FOO BAR 0.40 0.20 0.40 0.50 0.60 0.80 1.50 1.50 1.50 -42.00 100010111101110101000111010 
+0

Plz vérifier l'édition dans l'OP – lugte098

+0

Je veux être en mesure de spécifier la position du "1" ou "0". Seul l'exemple OP utilisé la première position – lugte098

+0

montrent un exemple valide de votre fichier d'entrée, et décrivez plus clairement en utilisant ce fichier d'entrée Je ne comprends pas votre problème Votre déclaration de sous-chaîne dans OP est correcte si vous essayez de tirer le 1er caractère du treizième champ, pourquoi cela ne fonctionne-t-il pas? si vous voulez la 8ème position de 13 $, alors faites 'substr ($ 13,8,1) == 1' – ghostdog74