2017-10-31 1 views
2

Ich habe zwei Dateien:Wie ein awk-Variable aus einer anderen Datei verwenden

  • File1 enthält, Breite, Länge, Höhe und prozentuale Veränderung eines Parameters
  • File2 enthält Höhe und durchschnittliche absolute Parameter.

File1

89.0 -179.0 40.0 -1.9290 
89.0 -179.0 50.0 -1.7720 
89.0 -179.0 70.0 -0.8970 
89.0 -179.0 90.0 -0.4020 
87.0 -179.0 40.0 -2.6490 
87.0 -179.0 50.0 -2.4850 
87.0 -179.0 70.0 -1.5370 
87.0 -179.0 90.0 -0.7770 
85.0 -179.0 40.0 -2.0090 
85.0 -179.0 50.0 -1.8270 
85.0 -179.0 70.0 -1.2930 
85.0 -179.0 90.0 -0.5480 
83.0 -179.0 40.0 -0.6930 
83.0 -179.0 50.0 -0.4000 
83.0 -179.0 70.0 -0.1050 
83.0 -179.0 90.0 0.1200 
81.0 -179.0 40.0 -0.3000 
81.0 -179.0 50.0 -0.0780 
81.0 -179.0 70.0 0.1760 
81.0 -179.0 90.0 0.1430 

File2

40.0000000  4.3764738518518698 
50.0000000  4.3796847037037017 
70.0000000  4.3780389444444472 
90.0000000  4.3688861728394963 

Nun, ich brauche eine Datei mit der geographischen Breite, Länge, Höhe und absolute Parameter zu erstellen. Grundsätzlich muss ich p in p (1 + a/100) ändern, wobei p der Durchschnittsparameter und a die prozentuale Änderung ist. Die resultierende Datei wird wie folgt aussehen:

89.0 -179.0 40.0 4.2920516 

kann ich tun, während Schleife oder jede andere Schleife, dies zu tun, sondern ist an der Zeit für eine große Datei raubend. Ich glaube, es gibt ein One-Liner-Awk, das ich nicht herausfinden kann.

versuchte ich

awk 'FNR==NR{a[NR]=$2;next}{$4=a[FNR]*(1+$4/100)}1' file2 file1 

Aber dieses funktioniert nur, wenn die Reihenfolge der Höhe derselben in den Dateien sowohl ist und wenn beide Dateien gleiche Anzahl von Zeilen haben.

Ich möchte nach der Höhe in der ersten Datei suchen, nehme den entsprechenden Durchschnittsparameter und verwende ihn als eine Variable für die zweite Datei. Kann es gemacht werden?

Antwort

2

können Sie numerischen Vergleich zwingen, mit +0

$ awk 'NR==FNR {a[$1+0]=$2; next} 
     $3+0 in a{$4=a[$3+0]*(1+$4/100)}1' file2 file1 

89.0 -179.0 40.0 4.29205 
89.0 -179.0 50.0 4.30208 
89.0 -179.0 70.0 4.33877 
89.0 -179.0 90.0 4.35132 
87.0 -179.0 40.0 4.26054 
87.0 -179.0 50.0 4.27085 
87.0 -179.0 70.0 4.31075 
87.0 -179.0 90.0 4.33494 
85.0 -179.0 40.0 4.28855 
85.0 -179.0 50.0 4.29967 
85.0 -179.0 70.0 4.32143 
85.0 -179.0 90.0 4.34494 
83.0 -179.0 40.0 4.34614 
83.0 -179.0 50.0 4.36217 
83.0 -179.0 70.0 4.37344 
83.0 -179.0 90.0 4.37413 
81.0 -179.0 40.0 4.36334 
81.0 -179.0 50.0 4.37627 
81.0 -179.0 70.0 4.38574 
81.0 -179.0 90.0 4.37513 
+0

Vielen Dank –

+0

was ein nicht {...} bedeuten? Ist es eine Sequenz? –

+0

Es ist die Anweisung, die ausgeführt wird, wenn die vorherige Bedingung zutrifft. "$ 3 in einem" – karakfa

Verwandte Themen