Entfernen einer bestimmten Zeile aus einer Datei

7

Irgendwo in der Mitte meiner CSV-Datei befindet sich diese Zeile:

Products below this line are out of stockNumber, month, year, reference, store

Hinweis: Nummer, Monat, Jahr, Referenz und Speicher sind die CSV-Felder.

Wie lösche ich diese Zeile mit einem Befehlszeilenbefehl aus der Datei?

Beachten Sie, dass die CSV so ist

Number, month, year, reference, store
1,1,2014,13322,main
2,2,2014,13322,main
3,3,2011,1322,main
4,4,2012,3322,main
5,4,2013,122,secondary
Products below this line are out of stockNumber, month, year, reference, store
12,411,2010,122,Albany
25,41,2009,122,Dallas
35,24,2008,122,New
DuckDucking
quelle
3
Was unterscheidet die zu löschende Zeile von anderen Zeilen?
Cuonglm
änderte die Frage. Hör zu.
DuckDucking

Antworten:

17

Der einfachste Weg ist die Verwendung des grep -vBefehls:

grep -v "Products below" your_file.csv > new_file.csv

svq
quelle
10

Mit Ihren Eingabedaten können Sie versuchen:

$ sed '/^Products/d' file 
Number, month, year, reference, store
1,1,2014,13322,main
2,2,2014,13322,main
3,3,2011,1322,main
4,4,2012,3322,main
5,4,2013,122,secondary
12,411,2010,122,Albany
25,41,2009,122,Dallas
35,24,2008,122,New

Verwenden Sie sed -i.bak, um die Datei an Ort und Stelle zu bearbeiten und eine Sicherungsdatei zu erstellen:

sed -i.bak '/^Products/d' file
cuonglm
quelle
mit bestimmten Versionen von sedIhnen müssen Sie nicht -i.baknur -itun (aber natürlich ohne Sicherungsdatei)
user13107
@ user13107 in einigen Versionen muss man sagen , -i''für dass , obwohl
SztupY
@SztupY: In -i''der Shell sollte das ausziehen ''und dich in -iRuhe lassen. Zumindest wenn es sich um eine Standard-Bourne-ähnliche Hülle handelt.
MvG
1
@ MvG: verpasste den Raum zwischen -iund''
SztupY
5

Wenn wir davon ausgehen können, dass Sie alle Zeilen löschen möchten, die mit beginnen Products(einschließlich des Leerzeichens nach dem ersten Wort), funktionieren alle:

  • awk

    awk '$1!="Products" file > newfile
    
  • perl

    perl -ne 'print unless /^Products/' file > newfile
    

    oder

    perl -ane 'print if $F[0]!="Products"' file > newfile
    

    oder, um die Datei an Ort und Stelle zu bearbeiten

    perl -i -ne 'print unless /^Products/; ' file
    perl -i -ane 'print if $F[0]!="Products"' file 
    
  • grep (dies ist nur eine kürzere Version der Antwort von svq )

     grep -v ^Products file > newfile
    
  • Bash (nur zum Spaß)

    while read line; do [[ $line =~ ^Products ]] || echo $line; done <  file > newfile
    
terdon
quelle
5

an Ort und Stelle mit ed(an der bashEingabeaufforderung)

ed -s file <<<$'/Products below/d\nw'

Oder wie Don Crissti empfiehlt:

ed -s file <<<$'/Products below/d\nw\nq'
iruvar
quelle
2
edAntworten verdienen immer eine +1
Evilsoup
1
Seconding @evilsoup; Wenn Sie sich jedoch an das Buch halten möchten, sollten Sie auch den qUnterbefehl uit hinzufügen :$'/Products below/d\nw\nq'
don_crissti
3

Sie können das sedSuchmuster verwenden, um jede Zeile zu löschen, die dieses Muster enthält

sed -i '/Products below this line are out of stockNumber, month, year, reference, store/d' file
Raza
quelle
3

Perl Oneliner:

perl -ne 'print unless (m/Products below/') FILE
Baba
quelle
2

Hier ist noch ein weiteres Beispiel für die Verwendung sed:

sed '/^Products below this line are out of stockNumber, month, year, reference, store$/d' originalDocument > newDocument
Ryekayo
quelle