webentwicklung-frage-antwort-db.com.de

Verwenden von AWK zum Herausfiltern der Spalte mit numerischen Bereichen

Ich bin relativ neu in BASH und versuche, mit awk die Daten der Spalte 1 basierend auf der vierten Spalte einer Textdatei herauszufiltern. Wenn die vierte Spalte mit dem Bereich von x übereinstimmt, werden die Daten der Spalte 1 ausgegeben. "x" soll ein Zahlenbereich von 1 bis 10 (1, 2, 3, 10) sein. 

awk -F: '{ if($4=="x") print $1}' filename.txt

filename.txt 
sample1 0 0 4
sample2 0 0 10
sample3 0 0 15
sample4 0 0 20

Tatsächliche Verwendung:

awk -F: '{ if($4=="1-10") print $1}' sample.txt
output = sample1, sample2, sample3, sample4

Es sollte nur sample1 sample2 sein.

Gibt es einen Fehler in der Syntax, den ich nicht sehe, oder ich könnte diese Syntax möglicherweise völlig falsch verwenden?

31
BurN135
awk '{ if ($4 >= 1 && $4 <= 10) print $1 }' sample.txt
62
Kambus
awk '$4 ~ /^[1-9]$|^10$/{print $1}' sample.txt

ausgabe:

sample1
sample2

erläuterung:

  • ^[1-9]$ -> $ 4 muss eine einzelne Ziffer von 1 bis 9 sein
  • | (die Pfeife) -> oder
  • ^10$ -> $ 4 muss die Nummer 10 sein
13
olibre
awk -F ':' '$4 >= 1 && $4 <= 10{print $1}'
4
Gregory Patmore

Es gibt möglicherweise eine Möglichkeit, dies mit Hilfe von awk zu tun (nevermind, siehe meine Bearbeitung unten), aber ich weiß es nicht. Ich würde es mit grep kombinieren: 

egrep ' ([1-9]|10)$' sample.txt | awk '{print $1}'

Ich denke, Sie passen in die vierte Spalte mit der Zeichenfolge "1-10" und nicht in den Bereich. Außerdem ändert -F: das Trennzeichen in einen Doppelpunkt und nicht in ein Leerzeichen. 

Bearbeiten: 

awk '$4 ~ /^([1-9]|10)$/ {print $1}' sample.txt
2
gpojd

Wenn Perl eine Option ist, können Sie diese Lösung ähnlich wie die awk-Lösung von Kambus ausprobieren:

Perl -lane 'print $F[0] if $F[3] >= 1 && $F[3] <= 10' sample.txt

Diese Befehlszeilenoptionen werden verwendet:

  • -n Schleife um jede Zeile der Eingabedatei, nicht jede Zeile automatisch drucken

  • -l entfernt Zeilenumbrüche vor der Verarbeitung und fügt sie anschließend wieder ein

  • -a autosplit mode - teilt die Eingabezeilen in das @F-Array auf.

  • -e den Perlcode ausführen

@F ist das Array von Wörtern in jeder Zeile, das mit 0 indiziert wird

1
Chris Koknat

Wenn awk nach Werten aus einem Bereich suchen soll, können Sie diesen Bereich in der BEGIN-Anweisung festlegen. 

awk 'BEGIN{for (i=1;i<=10;i++) a[i]} ($4 in a){print $1}' sample.txt 

Prüfung:

[jaypal:~/Temp] cat sample.txt 
sample1 0 0 4
sample2 0 0 10
sample3 0 0 15
sample4 0 0 20
[jaypal:~/Temp] awk 'BEGIN{for (i=1;i<=10;i++) a[i]} ($4 in a){print $1}' sample.txt 
sample1
sample2
1
jaypal singh