2016-04-14 10 views
0

Für das Leben von mir kann ich nicht diesen Teil meiner Linux-Aufgabe zu arbeiten. Dies ist die Voraussetzung:Löschen Sie Datensätze, die einen regulären Ausdruck mit sed entsprechen

Bisher haben wir:

grep -iv chevy cars 

Nun wollen wir die Autos löschen, die $ 10.000 oder mehr sind. Pipe die Ausgabe von der Grep in eine sed, um dies zu tun, durch Löschen von Datensätzen, die einen regulären Ausdruck entsprechen 5 (oder mehr) Ziffern am Ende eines Datensatzes (DO NOT verwenden einen Wiederholungsfaktor, wie {5}, für this):

ich fühle mich wie es sein sollte:

grep -iv 'chevy' cars | sed '/[0-9][0-9][0-9][0-9][0-9]*/ d' 

ich viele Lösungen ausprobiert habe schon hier .. und nichts funktioniert.

Eingabedaten:

plym fury 77  73  2500 
chevy nova 79  60  3000 
ford mustang 65  45  17000 
volvo gl  78  102  9850 
ford ltd  83  15  10500 
Chevy nova 80  50  3500 
fiat 600  65  115  450 
honda accord 81  30  6000 
ford thundbd 84  10  17000 
toyota tercel 82  180  750 
chevy impala 65  85  1550 
ford bronco 83  25  9525 
+0

können wir eine Probe der Eingangsdaten zu sehen. – zee

+0

Hinzugefügt die Eingabedaten –

+0

Was ist mit diesem 'sed' Befehl nicht genau funktioniert? –

Antwort

0

Sie fehlten eine Menge [0-9]:

grep -vi chevy cars| sed '/[0-9][0-9][0-9][0-9][0-9][0-9]*$/d' 
plym fury 77 73 2500 
volvo gl 78 102 9850 
fiat 600 65 115 450 
honda accord 81 30 6000 
toyota tercel 82 180 750 
ford bronco 83 25 9525 

tut, was Sie wollen. alles mit fünf oder mehr Ziffern wurde weggelassen.

+0

Obwohl die Regex, die Sie eigentlich * wollen, ist wahrscheinlich einfach '[0-9] [0-9] [0-9] [0-9] [0-9] $' – tripleee

1

ignorierend, welches Programm Ihres Professors erwartet genau diese Anforderungen (dürfen nicht mit „Chevy“ oder „Chevy“ beginnen, muß nicht mit einer Zahl mit 5 oder mehr Ziffern enden) würde auch in einen einzigen sed Befehl passen:

$ sed '/^[Cc]hevy/d;/[[:digit:]]\{5,\}$/d' cars 
plym fury 77  73  2500 
volvo gl  78  102  9850 
fiat 600  65  115  450 
honda accord 81  30  6000 
toyota tercel 82  180  750 
ford bronco 83  25  9525 

oder ein einzelner Befehl grep:

$ grep -vi '^chevy\|[[:digit:]]\{5,\}$' cars 
plym fury 77  73  2500 
volvo gl  78  102  9850 
fiat 600  65  115  450 
honda accord 81  30  6000 
toyota tercel 82  180  750 
ford bronco 83  25  9525 

der tatsächliche Eingang Leerzeichen am Ende der Linien enthält, so über die Befehle nicht wirklich funktionieren würden. Wenn diese Rohlinge real und nicht nur ein Ergebnis der Kopie-Einfügen sind, würden sie berücksichtigt werden, wie folgt:

sed '/^[Cc]hevy/d;/[[:digit:]]\{5,\}[[:blank:]]*$/d' cars 

und

grep -vi '^chevy\|[[:digit:]]\{5,\}[[:blank:]]*$' cars 

+0

Vielleicht $ 'hinzufügen, um das Finale zu beschränken Nummer Regex bis zur letzten Spalte? (Angenommen, es sind Dollar, keine Meilen! :-) – tripleee

+0

Danke dafür! –

+0

@tripleee Ich tat dies zuerst, aber die Eingabe in der Frage hat (unechte?) Leerzeichen am Ende der Zeilen ... wird aktualisiert, um es zu berücksichtigen. –

0

Try this:

[[email protected] tmp]# awk '$5<10000' aaaaaaa.csv 
plym fury 77  73  2500 
chevy nova 79  60  3000 
volvo gl  78  102  9850 
Chevy nova 80  50  3500 
fiat 600  65  115  450 
honda accord 81  30  6000 
toyota tercel 82  180  750 
chevy impala 65  85  1550 
ford bronco 83  25  9525 
0

Autos:

plym fury 77  73  2500 
chevy nova 79  60  3000 
ford mustang 65  45  17000 
volvo gl  78  102  9850 
ford ltd  83  15  10500 
Chevy nova 80  50  3500 
fiat 600  65  115  450 
honda accord 81  30  6000 
ford thundbd 84  10  17000 
toyota tercel 82  180  750 
chevy impala 65  85  1550 
ford bronco 83  25  9525 

Versuchen Sie folgendes:

$ grep -iv 'chevy' cars | sed -r '/[0-9][0-9][0-9][0-9][0-9]+/d' 

Ausgang:

plym fury 77  73  2500 
volvo gl  78  102  9850 
fiat 600  65  115  450 
honda accord 81  30  6000 
toyota tercel 82  180  750 
ford bronco 83  25  9525 
0
awk '$5 < 10000 && !/[Cc]hevy/' file 
    plym fury 77  73  2500 
    volvo gl  78  102  9850 
    fiat 600  65  115  450 
    honda accord 81  30  6000 
    toyota tercel 82  180  750 
    ford bronco 83  25  9525 
Verwandte Themen