2017-05-26 5 views
-1

Ich habe eine Textdatei mit 26 Spalten und muss nur Zeilen filtern, wenn Spalte 22 den Wert '0', '1', '2' oder '3' (von 0 hat -5).Filter Textdatei basierend auf Spaltenwert

Wenn Spalte 22 den Wert '0', '1', '2' oder '3' (unten hervorgehoben) hat, entfernen Sie alles unter 10 und größer 100 (basierend auf Spalte 5) UND entfernen Sie alles weniger als 5.0 (Diese Spalte hat Dezimalstellen) (basierend auf Spalte 13).

Ich bin nicht sicher, wie die Bedingung der folgenden nur einfügen, wenn Spalte 22 die folgenden Werte von 1 bis 3 hat und die anderen Zeilen (dh, die Werte 4 und 5 hat) wie in der Ausgabedatei

awk -F "\t" 'NR==1; NR>1 {if ($5 > 10 && $5<100 && $13>5.0) print $0}' input.txt > output.txt 

Meine Eingabedatei ist wie folgt

Column1 ... Column5 ... Column13 .. Column22
ID1 a1 5 0 5
ID2 a2 10 1.2 0
ID3 a3 4 5,6 1
ID4 a4 300 2,6 2
ID5 a5 40 32 0
ID6 a6 200 4,6 3
ID7 a7 200 4,5 5
ID8 a8 3456 4.9 4

und meine gewünschte Ausgabe ist

Column1 Column5 Column13 Column22

ID1 a1 5 0 5

ID7 a7 200 4,5 5

ID8 a8 a5 ID5 3456 4,9 4

Jede Hilfe wird geschätzt. Danke

+1

Beispiel Eingabe und erwartete Ausgabe würde geschätzt werden. – piokuc

+0

sorry @piokuc, ich habe jetzt die Beispieleingabe und die erwartete Ausgabe hinzugefügt. – nbn

+0

Ihre Beispieleingabe/-ausgabe ist nicht verwendbar, da Sie andere Spalten weggelassen haben, auf die das Skript für den Index der rechten Spalte verweisen muss. – karakfa

Antwort

1

eine Alternative wäre ...

awk -F'\t' '{p=0<=$22 && $22<=3; q=10<$5 && $5<100 && 5<$13} NR==1 || q || !p ' file 

Sie wollen die anderen Bedingungen (q) nur angewendet, wenn $22 zwischen 0 und 3 (p) ist.

Wenn Sie über eine testbare Eingabe verfügen, könnte dies verifiziert sein.

+0

Danke, aber das gibt eine ähnliche Ausgabe wie der Code, den ich auch versuchte, wo es die Werte 0-3 von $ 22 filtert, aber nicht die Werte 4 und 5 in der Ausgabe beibehalten. – nbn

+0

siehe das Update. – karakfa

+0

danke, das funktioniert! – nbn

Verwandte Themen