web-dev-qa-db-fra.com

comment sous-définir un fichier - sélectionner un nombre de lignes ou de colonnes

J'aimerais avoir votre avis/aide sur la façon de sous-ensemble un gros fichier (millions de lignes ou de lignes).

Par exemple,

(1) J'ai un gros fichier (des millions de lignes, délimitées par des tabulations). Je veux un sous-ensemble de ce fichier avec uniquement des lignes de 10000 à 100000.

(2) J'ai un gros fichier (des millions de colonnes, délimitées par des tabulations). Je veux un sous-ensemble de ce fichier avec uniquement des colonnes de 10000 à 100000.

Je sais qu'il y a des outils comme la tête, la queue, la coupe, la fente et l'awk ou le sed. Je peux les utiliser pour faire un sous-ensemble simple. Mais, je ne sais pas comment faire ce travail.

Pourriez-vous s'il vous plaît donner des conseils? Merci d'avance.

21
jianfeng.mao

Le filtrage des lignes est facile, par exemple avec AWK:

cat largefile | awk 'NR >= 10000  && NR <= 100000 { print }'

Le filtrage des colonnes est plus facile avec CUT:

cat largefile | cut -d '\t' -f 10000-100000

Comme Rahul Dravid l'a mentionné, cat n'est pas un must ici, et comme l'a ajouté Zsolt Botykai, vous pouvez améliorer les performances en utilisant:

awk 'NR > 100000 { exit } NR >= 10000 && NR <= 100000' largefile
cut -d '\t' -f 10000-100000 largefile 
29
Drakosha

Quelques solutions différentes:

Pour les plages de lignes: Dans sed:

sed -n 10000,100000p somefile.txt

Pour les plages de colonnes dans awk:

awk -v f=10000 -v t=100000 '{ for (i=f; i<=t;i++) printf("%s%s", $i,(i==t) ? "\n" : OFS) }' details.txt
17
Vijay

Pour le premier problème, sélectionner un ensemble de lignes dans un fichier volumineux, passer la queue à la tête est très simple. Vous voulez 90000 lignes du grand fichier à partir de la ligne 10000. tail saisit l'extrémité arrière du grand fichier à partir de la ligne 10000, puis la tête coupe tout sauf les 90000 premières lignes.

tail -n +10000 largefile | head -n 90000 -
4
Warren

A été battu pour la solution sed, donc je posterai un Perl dito à la place. Pour imprimer les lignes sélectionnées.

$ seq 100 | Perl -ne 'print if $. >= 10 && $. <= 20' 
10
11
12
13
14
15
16
17
18
19
20

Pour imprimer des colonnes sélectives, utilisez

Perl -lane 'print $F[1] .. $F[3] '

-F est utilisé conjointement avec -a, pour choisir le délimiteur sur lequel séparer les lignes.

Pour tester, utilisez seq et paste pour obtenir générer des colonnes

$ seq 50 | paste - - - - -
1   2   3   4   5
6   7   8   9   10
11  12  13  14  15
16  17  18  19  20
21  22  23  24  25
26  27  28  29  30
31  32  33  34  35
36  37  38  39  40
41  42  43  44  45
46  47  48  49  50

Permet d'imprimer tout sauf la première et la dernière colonne

$ seq 50 | paste - - - - - | Perl -lane 'print join "   ", $F[1] .. $F[3]'
2   3   4
7   8   9
12  13  14
17  18  19
22  23  24
27  28  29
32  33  34
37  38  39
42  43  44
47  48  49

Dans l'instruction join ci-dessus, il y a un onglet, vous l'obtenez en faisant un onglet ctrl-v.

3
Fredrik Pihl