2017-07-11 2 views
0

Angenommen, ich habe eine Datei mit diesen StrukturenWie lösche ich die ersten 10 Zeilen, die eine bestimmte Zeichenfolge enthalten?

1001.txt 
1002.txt 
1003.txt 
1004.txt 
1005.txt 
2001.txt 
2002.txt 
2003.txt 
... 

Nun, wie kann ich die ersten 10 Nummern der Zeile, die mit ‚2‘ beginnen löschen? Es kann mehr als 10 Zeilen geben, die mit '2' beginnen.

Ich weiß, ich kann grep '^2' file | wc -l verwenden, um die Anzahl der Zeilen zu finden, die mit '2' beginnen. Aber wie lösche ich die ersten 10 Zeilennummern?

+0

Sie könnten einen Hinweis hier finden https://stackoverflow.com/questions/23696871/how-to-remove-only-the -first-on-line-in-a-file-using-sed – JeffUK

Antwort

2

Sie können über die Pipeline Ihre Liste durch diese Perl Einzeiler:

perl -p -e '$_="" if (/^2/ and $i++ >= 10)' 
+0

Wie kann ich festlegen, welche Datei überprüft werden soll? – pwan

+0

@Pwan 'Mann perlrun' und schauen Sie sich die' -p' und '-i' Optionen an. – slim

0

awk Alternative:

awk '{ if (substr($0,1,1)=="2") { count++ } if (count > 10 || substr($0,1,1)!="2") { print $0 } }' filename 

Wenn das erste Zeichen der Linie 2 ist, einen Zähler zu erhöhen. Drucken Sie dann nur die Zeile, wenn der Zählerstand größer als 10 ist oder das erste Zeichen nicht 2.

0

Ein anderer in awk. Testen mit Wert 2, da Ihre Daten nur 3 Zeilen verwandter Daten enthielten. Ersetzen Sie die letztere 2 mit einem 10.

$ awk '/^2/ && ++c<=2 {next} 1' file 
1001.txt 
1002.txt 
1003.txt 
1004.txt 
1005.txt 
2003.txt 
. 
. 
. 

Erklärt:

$ awk '/^2/ && ++c<=2 { # if it starts with a 2 and counter still got iterations left 
    next     # skip to the next record 
} 1      # (else) output 
' file 
+1

Oder invertieren Sie die Logik: 'awk '!/^ 2/|| ++ c> 10'' –

+0

ich habe das Ergebnis genau wie du. aber nichts ändert sich in der Datei. – pwan

+0

Die Quelldatei wird nicht geändert. Sie müssen die Ausgabe in eine neue Datei umleiten. Es ist sicherer. –

Verwandte Themen