-1
votes

Comment je peux imprimer la ligne toutes les quatre lignes

J'ai un fichier contenant 8000 lignes, je veux imprimer des lignes 1,4,8,12, ..., 7996.

J'ai essayé ce code xxx

Mais cette erreur apparaît:

./ test.csh: ligne 3: 4 * {1: Erreur de syntaxe: Opérande attendue (jeton d'erreur est "{1")

Quel est le problème, comment puis-je faire cela?


3 commentaires

Le message d'erreur indique que vous utilisez csh , pas bash. Ce sont des langues fondamentalement différentes.


Si vous voulez chaque 4ème ligne à partir du premier, la séquence est de 1, 5, 9, 13, ...


Évitez du tout que l'utilisation de csh . Il est cassé, buggy et juste défectueux. Top 10 des raisons de ne pas utiliser C shell et Programmation de la CSH considérée comme nocif


3 Réponses :


2
votes

Utiliser awk commande: xxx

explication: xxx


4 commentaires

@David mais qui imprimera lorsque le modulo est 2 ou 3, aussi.


Oh, correct tu es - je savais que le café avait porté alors ... Je pense vraiment que vous avez besoin de awk 'nr == 1 || Nr% 4 == 0 ' Pour correspondre 1, 4, 8, 12, 16, ... Voici un test rapide Vous pouvez exécuter printf "% s \ n "{1..20} | awk 'nr == 1 || NR% 4 == 0 ' Si vous n'êtes pas sur BASH, utilisez $ (SEQ 1 20) au lieu de l'expansion BRACE .


La raison pour laquelle je dis que c'est maintenant vous correspondez à 1, 5, 9, 13, ...


Pour rendre cela un peu plus petit: awk 'nr% 4 == 1' fichier . Awk fonctionne avec modèle {action} paires. Si un modèle est écrit, l'action par défaut est imprimer 0 $ .



1
votes

Si vous préférez SED code> xxx pré>

assez intéressant, il s'agit de l'exemple exact indiqué dans man SED code> p>

'Premier ~ étape' Cette extension GNU correspond à chaque ligne de marche commençant par la ligne PREMIER. En particulier, des lignes seront sélectionnées lorsqu'il existe un non négatif n tel que le numéro de ligne actuel est égal au premier + (n * MARCHER). Ainsi, on utiliserait '1 ~ 2' pour sélectionner le numéro impair lignes et '0 ~ 2' pour des lignes numérotées pair; choisir chaque troisième ligne À partir de la seconde, '2 ~ 3' serait utilisé; choisir tous les cinquième ligne commençant par le dixième, utilisez '10 ~ 5 '; et '50 ~ 0 'est juste un manière obscure de dire «50». p>

 The following commands demonstrate the step address usage:

      $ seq 10 | sed -n '0~4p'
      4
      8


0 commentaires

0
votes

Vous semblez essayer d'utiliser la syntaxe Bash, même si votre question est étiquetée .

Même donc, cela a plusieurs erreurs. Vous ne pouvez pas avoir d'espace après l'opérateur d'affectation, et vous devez citer le script SED (sinon il pense p est le premier nom de fichier ... ou je suppose Vous voulez dire réellement p ).

Mais l'idée que vous devez boucler sur le fichier 8000 fois et imprimer une ligne de la sorte dans chaque itération est également imparfaite. Vous pouvez dire sed d'imprimer toutes les chaînes de la quatrième ligne avec un seul script comme xxx

Je basculerais à la norme pour cela, cependant. xxx


1 commentaires

Les amis ne laissent pas amis utiliser CSH afin que ceci est peut-être une étape dans la bonne direction.