Mostra solo le linee dispari con il gatto


28

CIAO,

probabilmente è qualcosa di molto semplice, ma non capisco il punto adesso. In Linux, shell, dato un file di testo, come posso fare qualcosa di simile, cat nomefile in modo da vedere solo la prima riga, la terza riga, 5, 7, 9 e così via?

se non con il gatto, con un altro comando

Grazie

bash 

Risposte:


42

Utilizzando awk:awk 'NR % 2 == 0' filename

Modifica: rimosso {print}, come mostrato nella risposta di ghostdog74 e commentato da Roberto Bonvallet.


1
{print}è l'azione predefinita, quindi awk 'NR % 2 == 0' < myfileè sufficiente.

3
@roberto, non è necessario il reindirizzamento dell'input.
user31894,

1
Proprio come una nota, questo mostra linee pari (dove la prima riga è 1) e linee dispari (se si considera la prima riga come 0). Sostituire 2 == 0con 2 == 1per il contrario.
cde

13

O qualcosa del genere

sed -n 'p;n' filename

Per una spiegazione, consultare la pagina man di sed.


Questa è la sedversione portatile che mi è passata per la testa.
Chris Johnsen,

1
puoi facilmente saltare le linee in anticipo con sed -n '1d;p;n', ad esempio, per le linee pari
kisp

7

Usa sed:

sed -n 1~2p filename

1
Questa è un'estensione GNU. Potrebbe non funzionare con sistemi in cui GNU sednon è l'impostazione predefinita.
Chris Johnsen,

Vero, ma dovrebbe funzionare con la maggior parte dei gusti di Linux

Hmm .. Ho appena provato "sed --posix -n 1 ~ 2p nomefile" e anche quello sembra funzionare. --Posix dovrebbe rimuovere il supporto per le estensioni gnu.

Il sedmanuale GNU gnu.org/software/sed/manual/html_node/Addresses.html#Addresses dice "first ~ step This GNU extension ...". Non menziona --posix. Quando provo gsed --posix -n 1~2p(GNU sed 4.2.1), ottengo gsed: -e expression #1, char 2: unknown command: ‘~’.
Chris Johnsen,

Ok .. ha senso. Non so cosa c'è che non va nella mia sed. Sto usando Cygwin, quindi potrebbe avere qualcosa a che fare con esso.


2

2 modi in cui puoi farlo con awk

$ awk '{getline;print}' file # the equivalent of the selected sed answer
$ awk 'NR%2==0' file

O con solo il guscio

i=1; while read -r line; do [ $((i++ % 2)) -eq 0 ] && echo $line; done <"file"


0

Non l'ho provato (non sembra funzionare su Mac OS X), ma GNU sed supporta first~stepcome selezione dell'indirizzo, quindi ad esempio:

sed -n 1~2p file

inizierebbe dalla prima riga e stampa dopo ogni altra riga.


Bene, questa è un'estensione GNU. Mac OS X utilizza un BSD sednell'installazione di base.
Chris Johnsen,


-2

È possibile utilizzare questi comandi per richiedere il risultato

awk "NR% 2 == 1"

sed -ne '1 ~ 2p'


2
-1. Questo duplica le risposte di quasi 10 anni fa, le differenze minori non sono affatto spiegate. E perché è ls -lqui?
Kamil Maciorowski il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.