2010-04-01 13 views
29

Come posso rimuovere ogni linea dispari, usando sed?Come rimuovere ogni altra linea con sed?

remove 
keep 
remove 
keep 
remove 
... 
+0

La metà delle domande di questa mattina sembra essere april fools scherzi pure ... – Will

+0

Se è un pesce d'aprile, la risposta deve essere: grep Non input.txt – paxdiablo

+0

@paxdiablo: Ma per quanto riguarda 'grep -v Remove'? – Cascabel

risposta

51

GNU sed ha una modalità di indirizzamento adatto:

sed -n '1~2!p' file 

che significa, partendo dalla linea 1, e con il passaggio 2, stampa tutte le altre linee.

equivalente, è possibile eliminare il -n, ed eliminare le linee corrispondenti:

sed '1~2d' 

Può anche essere fatto utilizzando awk:

awk 'NR%2==0' file 

(Ogni volta che il numero di riga è un multiplo di 2, stampa la linea)

+0

Grazie per questo! molto utile. –

+1

Ricevo l'errore "codice comando non valido ~" quando provo con sed su macos. –

31

Ecco il più breve che posso pensare:

sed -n 'g;n;p' file 

Dovrebbe funzionare con versioni non GNU di sed (così come GNU sed). più

+4

+1 per la portabilità –

+3

Anche su OS X! (A differenza di 'sed -n '1 ~ 2! P''.) Ci vogliono le linee 2,4,6, ... Non riuscivo a capire dalla pagina man come prendere le linee 1,3,5, .. Aggiungere una prima linea è un semplice trucco, però. – Nagel

+7

@Nagel: prova: 'sed -n 'p; n' file' o' sed 'n; d' file' per l'output delle linee dispari. A proposito, non penso che 'g' sia necessario per l'output delle linee pari:' sed -n 'n; p' file' sembra funzionare. –

3

soluzione Perl:

perl -ne 'print if $. % 2 == 0' file 

$. è il numero di riga

+0

Il tizio ha chiesto 'sed', che mostra una scarsa capacità di lettura da parte tua, ma qualcuno potrebbe trovare utile questo, quindi +1. –

+1

Ho risposto poiché sed, awk e perl possono essere spesso usati in modo intercambiabile. Mentre ci sono differenze di velocità e semplicità, sono tutti usati sulla riga di comando o all'interno degli script di shell. –

Problemi correlati