Liest den angegebenen Zeilenbereich aus einer Datei

15

Ich habe eine Datei, die 100000 Zeilen enthält, wie ich die Zeilen von Zeile # 5555 bis Zeile # 7777 unter Linux bekommen kann.

Danke für alles.


quelle
1
@ibrahim, erwägen Sie, Kyles Antwort zu akzeptieren (indem Sie das grüne Häkchen links
ankreuzen
Sie können genau angeben, ob Sie sed verwenden möchten oder ob andere Tools in Ordnung sind.
Manu H
Ein bisschen Forschung wirft zumindest stackoverflow.com/questions/83329/…
sancho.s Reinstate Monica

Antworten:

22
sed '5555,7777!d' <filename>

Dadurch werden die Zeilen 5555-7777 der Datei einschließlich gedruckt.

Dennis hat folgendes gepostet, was meiner Meinung nach schneller sein sollte:

sed '5555,7777p; 7778q' filename

Der folgende Beweis, dass es schneller sein sollte:

$ n=1
$ while [[ n -le 100000 ]]; do echo $n >> sedtest2; n=$((n + 1)); done
$ strace -e trace=read -o sed1 sed '5555,7777!d' sedtest2
$ strace -e trace=read -o sed2 sed '5555,7777p; 7778q' sedtest2
$ wc -l sed1
149 sed1
$ wc -l sed2
14 sed1

Nur in Bash (zum Spaß):

n=1
while read line; do 
    if [[ ($n -ge 5555) && ($n -le 7777)  ]]; then 
        echo $line
    elif [[ $n -gt 7777 ]]; then
        break
    fi 
    n=$(( $n + 1 ))
done < file
Kyle Brandt
quelle
Ich denke du $n -gt 3solltest vielleicht 7777 sein? Sie können auch if (( n >= 5555 ))mehr "natürlich" aussehende Vergleichsoperatoren verwenden (und die Möglichkeit, das Dollarzeichen wegzulassen). Und du kannst es tun ((n++)).
Bis auf weiteres angehalten.
16

Wenn Sie fertig sind, können Sie Folgendes beschleunigen:

sed -n '5555,7777p; 7778q' input_file
Bis auf weiteres angehalten.
quelle
1
+1, sollte schneller sein, aktualisierte meinen Beitrag, um zu zeigen, warum.
Kyle Brandt
7

Beides sollte funktionieren.

  • sed -n ' Startnummer , Endnummer p'
  • awk 'NR> = Startnummer && NR <= Endnummer ' Datei

Tolle Frage übrigens;)

Chopper3
quelle
1

Ich habe festgestellt, dass die sed-Option bei einer mysqldump-Datei nicht funktioniert, da Zeilenumbrüche oder Multibyte-Zeichen in Anführungszeichen gesetzt werden. Kopf und Schwanz schneiden es mit den gleichen Zeilennummern wie grep, was ich brauchte. Um die Zeilen $ j bis $ k zu erhalten, benötigen Sie:

x=$(( $k - $j + 1 ))
tail -n +$j filename | head -${x} 
Dave Crooke
quelle