Domanda

Ho un file molto lungo che voglio stampare ma saltando ad esempio le prime 1e6 righe. Guardo la pagina man di cat ma non ho visto alcuna opzione per farlo. Sto cercando un comando per fare questo o un semplice programma bash.

È stato utile?

Soluzione

Avrai bisogno della coda. Alcuni esempi:

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

Se hai davvero bisogno di saltare un particolare numero di " prima " linee, usa

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

Cioè, se si desidera saltare N linee, si inizia a stampare la linea N + 1. Esempio:

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

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

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

Altri suggerimenti

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

tail -n +1000001 huge-file.log

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

  

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

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

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

$ sed 1,10d file.txt

Una versione meno dettagliata con AWK:

awk 'NR > 1e6' myfile.txt

Ma consiglierei di usare numeri interi.

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

Esempio:

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

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

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

Se vuoi vedere le prime 10 righe puoi usare sed come di seguito:

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

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

sed -n '20,30 p' myFile.txt

Usa il sed delete comando -n con un indirizzo di intervallo . Ad 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 print con il flag <=>:

$ 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 utility GNU.

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):

edu@debian5:~$./script.sh 2 4 file.txt

Output di questo comando:

two
three
four

Naturalmente, puoi migliorarlo, ad esempio testando che tutti i valori degli argomenti sono previsti :-)

Puoi farlo usando i comandi head e tail:

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

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

sed -n '1d;p'

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

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

Avevo bisogno di fare lo stesso e ho trovato questa discussione.

Ho provato " tail -n +, ma ha appena stampato tutto.

Più + righe hanno funzionato bene sul prompt, ma si è scoperto che si comportava in modo totalmente diverso quando eseguito in modalità senza testa (cronjob).

Finalmente ho scritto questo da solo:

skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top