2017-08-01 2 views
0

Ich habe eine tab-getrennte Datei, in der fehlende Werte durch einen Punkt dargestellt werden. Zum Beispiel:Unix: Alle numerischen Werte einschließlich Nicht-Ganzzahlen erhalten

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 

Ich brauche alle Zeilen zu extrahieren, wobei der Wert in der dritten Spalte entweder numerisch (einschließlich nicht-ganze Zahl ist, negative Werte, wissenschaftliche Notation) ist oder fehlt. So sollte meine Ausgabe wie folgt aussehen:

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 

Bisher habe ich versucht, dies in awk tun mit awk -F"\t" 'BEGIN{OFS="\t"} ($3 ~ /^[[:alnum:]]+$/) {$1=$1; print}' aber dann nur ich

VAR1 VAR2 VAR3 VAR4 
ID2  foo  1  1 

Ich würde auch die Zeilen speichern möchte die nicht übereinstimmen (dh nicht numerisch sind und nicht fehlen) in einer separaten Datei.

Antwort

4

Wie dah Bogen:

$ 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 

Erklärt:

  • NR==1 wir mit dem Kopfsatz
  • Umgang
  • || oder
  • $3=="." dritte Feld ist ein Zeitraum
  • || oder
  • $3*1==$3 von einem multipliziert dritte Feld ist immer noch der gleiche Wert
+0

Danke, es hat wie ein Zauber funktioniert. Selbst als ich später erkannte, waren einige Werte in wissenschaftlicher Notation – Hill

2

versuchen Sie, folgen Sie und lassen Sie mich wissen, wenn dies Ihnen hilft.

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

ODER

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

Danke, sie beide für das Beispiel große arbeitete ich zunächst zur Verfügung gestellt, aber Ich erkannte dann, dass meine Daten einige Werte in wissenschaftlicher Notation haben. – Hill

+0

Die erste würde fälschlicherweise mit ':-)' übereinstimmen, während die zweite mit 'Joe90' nicht übereinstimmt. –

Verwandte Themen