2017-08-01 3 views
0

J'ai un fichier délimité par des tabulations où les valeurs manquantes sont représentées par un point. Par exemple:unix: obtient toutes les valeurs numériques, y compris les non-entiers

VAR1 VAR2 VAR3 VAR4 
ID1  foo  0.1  0.1 
ID2  foo  1  1 
ID3  foo  foo  . 
ID4  foo  foo  foo 
ID5  foo  .  1 
ID6  foo  -0.1 -0.1 
ID7  foo  -1  -1 
ID8  foo  5e-08 5e-08 

Je dois extraire toutes les lignes où la valeur dans la troisième colonne est numérique (y compris les non-entier, des valeurs négatives, la notation scientifique) ou manquant. Donc, ma sortie devrait ressembler à ceci:

VAR1 VAR2 VAR3 VAR4 
ID1  foo  0.1  0.1 
ID2  foo  1  1 
ID5  foo  .  1 
ID6  foo  -0.1 -0.1 
ID7  foo  -1  -1 
ID8  foo  5e-08 5e-08 

Jusqu'à présent, j'ai essayé de faire cela en utilisant awk awk -F"\t" 'BEGIN{OFS="\t"} ($3 ~ /^[[:alnum:]]+$/) {$1=$1; print}' mais je n'obtenir

VAR1 VAR2 VAR3 VAR4 
ID2  foo  1  1 

Je voudrais aussi enregistrer les lignes qui ne correspondent pas (c'est-à-dire non numériques et non manquantes) dans un fichier séparé.

Répondre

4

Comment arc dah:

$ awk '$3*1==$3 || $3=="." || NR==1' file 
VAR1 VAR2 VAR3 VAR4 
ID1  foo  0.1  0.1 
ID2  foo  1  1 
ID5  foo  .  1 
ID6  foo  -0.1 -0.1 
ID7  foo  -1  -1 

Expliqué:

  • NR==1 nous avons affaire à l'en-tête
  • || ou
  • $3=="." troisième champ est une période
  • || ou
  • $3*1==$3 troisième champ multiplié par un est toujours la même valeur
+0

Merci, ça a marché comme un charme. Même quand je me suis rendu compte plus tard certaines valeurs étaient en notation scientifique – Hill

2

essayez de suivre et faites le moi savoir si cela vous aide.

awk 'NR==1{print;next} $3 !~ /[a-zA-Z]/' Input_file 

OU

awk 'NR==1{print;next} $3 ~ /[0-9]/' Input_file 
+0

Merci, ils ont tous deux travaillé très bien pour l'exemple que je initialement prévu, mais J'ai alors réalisé que mes données ont des valeurs en notation scientifique. – Hill

+0

La première ne correspondrait pas correctement ':-)' alors que la seconde ne correspondrait pas correctement à' Joe90'. –