Afficher uniquement les lignes impaires avec le chat

28

SALUT,

est probablement quelque chose de très facile, mais je ne comprends pas maintenant. Sous Linux, shell, étant donné un fichier texte, comment puis-je faire quelque chose comme, cat filename donc je ne vois que la première ligne, la troisième ligne, 5, 7, 9 et ainsi de suite?

sinon avec chat, avec une autre commande

Merci


la source

Réponses:

42

En utilisant awk:awk 'NR % 2 == 0' filename

Edit: supprimé {print}, comme indiqué dans la réponse de ghostdog74 et commenté par Roberto Bonvallet.

Chris Johnsen
la source
1
{print}est l'action par défaut, donc awk 'NR % 2 == 0' < myfilec'est suffisant.
3
@roberto, vous n'avez pas besoin de la redirection d'entrée.
user31894
1
Tout comme une note, cela montre les lignes paires (où la première ligne est 1) et les lignes impaires (si vous pensez à la première ligne comme 0). Remplacez 2 == 0par 2 == 1pour le contraire.
cde
13

Ou quelque chose comme

sed -n 'p;n' filename

Pour obtenir des explications, recherchez la page de manuel de sed.

Adobe
la source
Ceci est la sedversion portable qui m'a échappé.
Chris Johnsen
1
vous pouvez facilement sauter des lignes à l'avance avec sed -n '1d;p;n'pour les lignes paires par exemple
kisp
7

Utilisez sed:

sed -n 1~2p filename
Andrew Dyster
la source
1
Ceci est une extension GNU. Il peut ne pas fonctionner sur des systèmes où GNU sedn'est pas la valeur par défaut.
Chris Johnsen
Vrai, mais devrait fonctionner avec la plupart des versions de Linux
Hmm .. J'ai juste essayé "sed --posix -n 1 ~ 2p filename" et cela semble fonctionner aussi. Le --posix est censé supprimer le support des extensions gnu.
Le sedmanuel GNU gnu.org/software/sed/manual/html_node/Addresses.html#Addresses dit «première étape Cette extension GNU…». Il ne le mentionne pas --posix. Quand j'essaye gsed --posix -n 1~2p(GNU sed 4.2.1), j'obtiens gsed: -e expression #1, char 2: unknown command: ‘~’.
Chris Johnsen
Ok .. est logique. Je ne sais pas ce qui ne va pas avec mon sed. J'utilise cygwin, donc cela pourrait avoir quelque chose à voir avec ça.
2
awk '{if(NR%2!=0)print}' myfile
mouviciel
la source
2

2 façons de le faire avec awk

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

OU avec juste la coquille

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

Je n'ai pas testé cela (ne semble pas fonctionner sur Mac OS X), mais GNU sed prend first~stepen charge la sélection d'adresse, par exemple:

sed -n 1~2p file

commencerait à la première ligne et imprimerait toutes les autres lignes après cela.


la source
C'est une extension GNU. Mac OS X utilise un BSD seddans l'installation de base.
Chris Johnsen
-1

Impossible de tester, a trouvé un lien: cat -n $ 1 | grep "$ ODDRE" | couper -b 8-> oddfile. $$

Francisco Aquino
la source
Vous avez manqué la chose la plus importante ... ce qui ODDREest prévu. Mais cette réponse ne fonctionnera que si le fichier est inférieur à un million de lignes.
Andrew McGregor
-2

Vous pouvez utiliser ces commandes pour exiger un résultat

awk 'NR% 2 == 1'

sed -ne '1 ~ 2p'

AAKANKSHA JAIN
la source
2
-1. Cela reproduit les réponses d'il y a près de 10 ans, les différences mineures ne sont pas expliquées du tout. Et pourquoi est ls -llà?
Kamil Maciorowski