Comment puis-je extraire des lignes à partir d'un fichier en utilisant leur numéro de ligne sur unix?

StackOverflow https://stackoverflow.com/questions/2017034

Question

En utilisant des lignes sed ou similaires comment vous extraire d'un fichier? Si je voulais les lignes 1, 5, 1010, 20503 à partir d'un fichier, comment pourrais-je obtenir ces 4 lignes?

Et si j'ai un assez grand nombre de lignes ai-je besoin d'extraire? Si j'avais un fichier avec 100 lignes, chacune représentant un numéro de ligne que je voulais extraire d'un autre fichier, comment pourrais-je faire?

Était-ce utile?

La solution

Quelque chose comme « sed -n '1p, 5p, 1010P, 20503p. Exécutez la commande " homme sed" pour plus de détails

Pour votre deuxième question, je transformer le fichier d'entrée en un tas de sed (1) des commandes pour imprimer les lignes que je voulais.

Autres conseils

avec awk il est aussi simple que:

awk 'NR==1 || NR==5 || NR==1010' "file"

@OP, vous pouvez le faire plus facilement et plus efficacement avec awk. Donc, pour votre première question

awk 'NR~/^(1|2|5|1010)$/{print}' file

pour la 2ème question

awk 'FNR==NR{a[$1];next}(FNR in a){print}' file_with_linenr file

J'enquêter sur Perl, car il dispose des installations regexp de sed plus le modèle de programmation qui l'entoure pour vous permettre de lire une ligne de fichiers en ligne, compter les lignes et extrait selon ce que vous voulez (y compris à partir d'un fichier les numéros de ligne).

my $row = 1
while (<STDIN>) {
   # capture the line in $_ and check $row against a suitable list.
   $row++;
}

Ce n'est pas assez et il pourrait dépasser les limites de longueur de commande dans certaines circonstances * :

sed -n "$(while read a; do echo "${a}p;"; done < line_num_file)" data_file

Ou son beaucoup plus lent mais plus attrayant, et peut-être plus sage, frères et soeurs:

while read a; do echo "${a}p;"; done < line_num_file | xargs -I{} sed -n \{\} data_file

Une variante:

xargs -a line_num_file -I{} sed -n \{\}p\; data_file

Vous pouvez accélérer les versions xarg un peu en ajoutant l'option -P avec quelques grands arguments comme, disons, 83 ou peut-être 419 ou même 1177, mais 10 semble aussi bon que.

* xargs --show-limits </dev/null peut être instructif

En Perl:

perl -ne 'print if $. =~ m/^(1|5|1010|20503)$/' file
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top