Contribution:
1
hgh
h2b
h4h
2
ok
koko
lkopk
3
uh
ju
nfjvn
4
Production attendue:
1
2
3
4
Donc, je dois avoir seulement la 1ère, 5ème, 9ème, 13ème valeur du fichier dans le fichier de sortie. Comment faire ça?
text-processing
Velu
la source
la source
sed -n '1~4p'
Réponses:
Utilisation d'AWK:
Comprendre comment cela fonctionne est laissé comme un exercice pour le lecteur.
la source
NR % 4 == 1
serait l'OMI plus lisible.Utilisation de
split
(GNU coreutils):-n
générerCHUNKS
des fichiers de sortieet
CHUNKS
commer/K/N
utiliser la distribution à tour de rôle et ne sortir que Kth de N vers sortie standard sans séparer les lignes / enregistrementsla source
Avec GNU
sed
:Avec standard
sed
:Avec
1
et4
dans$n
et$i
variables:la source
Ajout de la solution Perl obligatoire:
la source
Version Python, juste pour le plaisir:
la source
enumerate(f)
devrait être en mesure de faire le travail tout en consommant moins de mémoirereadlines
(d'où la fusion du fichier entier en mémoire), vous pouvez utiliserf.readlines()[::4]
pour obtenir toutes les quatre lignes. Vous pouvez donc utiliserprint(''.join(f.readlines()[::4]))
.POSIX sed
: cette méthode utilise le posixly sed et peut donc être exécutée partout, ou au moins les seds qui respectent le posix.Un autre est une génération de code sed programmatique à des fins d'évolutivité:
Perl
: nous remplissons le tableau A jusqu'à ce qu'il ait une taille de 4. Ensuite, nous imprimons son premier élément et effaçons également le tableau.la source
Appelez avec
scriptname filename skip
(4 dans votre cas) Cela fonctionne en tirant desiter
lignes du haut du fichier et en ne sortant que le dernier. Il augmente ensuiteiter
deskips
et se répète tant que la valeur deiter
n'a pas dépassé lelines
infile
.la source
Pure Bash:
mapfile est un module intégré ajouté dans Bash 4 qui lit l'entrée standard dans un tableau, ici nommé
lines
, avec une ligne par entrée. L'-t
option supprime les nouvelles lignes finales.Si vous souhaitez imprimer toutes les quatre lignes à partir de la ligne 4, vous pouvez le faire dans une seule commande en utilisant
mapfile
l'option de rappel de-C
, qui exécute le code fourni toutes les lignes, avec l'intervalle donné par-c
. L'index du tableau actuel et la ligne suivante à affecter sont donnés au code comme arguments.Cela utilise la fonction
printf
intégrée; le code de format%.0s
supprime le premier argument (l'index), donc seule la ligne est imprimée.Vous pouvez utiliser la même commande pour imprimer toutes les quatre lignes à partir de la ligne 1, 2 ou 3, mais vous devez ajouter 3, 2 ou 1 lignes
input
avant de l'alimentermapfile
, ce qui, à mon avis, est plus problématique que cela ne vaut la peine .Cela fonctionne également:
Ici,
printf
consomme quatre entrées du tableaulines
à la fois, imprimant uniquement la première et ignorant les trois autres avec%.0s
. Je n'aime pas cela, car vous devez manipuler manuellement la chaîne de format pour différents intervalles ou points de départ.la source