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

bash 

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.


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.


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

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

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"


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.


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


-2

Vous pouvez utiliser ces commandes pour exiger un résultat

awk 'NR% 2 == 1'

sed -ne '1 ~ 2p'


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.