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?
awk '{ if ($4 >= 1 && $4 <= 10) print $1 }' sample.txt
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 seinawk -F ':' '$4 >= 1 && $4 <= 10{print $1}'
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
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
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
[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