risposta-alla-domanda-sullo-sviluppo-web-bd.com

Stampa un file saltando le prime linee X in Bash

Ho un file molto lungo che voglio stampare ma saltare le prime linee 1e6 per esempio. Osservo la pagina man di cat ma non ho visto nessuna opzione per farlo. Sto cercando un comando per fare questo o un semplice programma bash.

456
Eduardo

Avrai bisogno di coda. Qualche esempio:

$ tail great-big-file.log
< Last 10 lines of great-big-file.log >

Se hai davvero bisogno di SALTA un particolare numero di "prime" linee, usa

$ tail -n +<N+1> <filename>
< filename, excluding first N lines. >

Cioè, se vuoi saltare N linee, inizi a stampare la riga N + 1. Esempio:

$ tail -n +11 /tmp/myfile
< /tmp/myfile, starting at line 11, or skipping the first 10 lines. >

Se vuoi solo vedere le ultime tante righe, ometti il ​​"+":

$ tail -n <N> <filename>
< last N lines of file. >

Se hai GNU coda disponibile sul tuo sistema, puoi fare quanto segue:

tail -n +1000001 huge-file.log

È il carattere + che fa ciò che vuoi. Per citare dalla pagina man:

Se il primo carattere di K (il numero di byte o linee) è un '+', stampa a partire dall'elemento Kth dall'inizio di ogni file.

Pertanto, come indicato nel commento, inserire +1000001 inizia a stampare con il primo elemento dopo le prime 1.000.000 di righe.

91
Eddie

Il modo più semplice che ho trovato per rimuovere le prime dieci righe di un file:

$ sed 1,10d file.txt
89
David Parks

Una versione meno dettagliata con AWK:

awk 'NR > 1e6' myfile.txt

Ma vorrei raccomandare l'uso di numeri interi.

25
newtover

Solo per proporre un'alternativa sed. :) Per saltare prima un milione di righe, prova |sed '1,1000000d'.

Esempio:

$ Perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005
13
tuomassalo

se vuoi saltare prima due righe
tail -n +3 <filename>

se vuoi saltare la prima linea x
tail -n +$((x+1)) <filename>

13
saipraneeth

Se vuoi vedere la prima riga puoi usare sed come di seguito:

sed -n '1,10 p' myFile.txt

oppure se vuoi vedere le righe da 20 a 30 puoi usare:

sed -n '20,30 p' myFile.txt
12
Kadir YILDIZ

Usa il comando sed delete con un indirizzo di intervallo . Per esempio:

$ sed 1,100d file.txt # Print file.txt omitting lines 1-100.

In alternativa, se si desidera stampare solo un intervallo noto, utilizzare il comando di stampa con il flag -n:

$ sed -n 201,300p file.txt # Print lines 201-300 from file.txt

Questa soluzione dovrebbe funzionare in modo affidabile su tutti i sistemi UNIX, indipendentemente dalla presenza di utilità GNU.

11
maerics

Questo script di shell funziona bene per me:

#!/bin/bash
awk -v initial_line=$1 -v end_line=$2 '{
    if (NR >= initial_line && NR <= end_line) 
    print $0
}' $3

Utilizzato con questo file di esempio (file.txt):

one
two
three
four
five
six

Il comando (estrarrà dalla seconda alla quarta riga nel file):

[email protected]:~$./script.sh 2 4 file.txt

Uscita di questo comando:

two
three
four

Certo, puoi migliorarlo, ad esempio testando che tutti i valori degli argomenti sono quelli attesi :-)

10
sourcerebels

Puoi farlo usando i comandi testa e coda:

head -n <num> | tail -n <lines to print>

dove num è 1e6 + il numero di righe che si desidera stampare.

5
Dana the Sane
sed -n '1d;p'

questo comando cancellerà la prima riga e stamperà il resto

4
cat < File > | awk '{if(NR > 6) print $0}'
3
aamadeo