Comment puis-je extraire des lignes à partir d'un fichier en utilisant leur numéro de ligne sur unix?
-
19-09-2019 - |
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?
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