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.
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
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
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 -
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.