5 votes

Trouver les lignes avec la valeur la plus basse dans leur troisième colonne en donnant les résultats de grep

J'ai un fichier qui se compose de lignes comme celle-ci (autres chiffres inclus). Il s'agit d'une partie de la sortie de

$ grep 1848 filename.csv

Comment puis-je trouver les 5 premières lignes qui ont la troisième colonne la plus basse dans le fichier .csv étant donné que 1848 se trouve soit dans la première, soit dans la deuxième colonne ?

1848,2598,11.310694021273559
1848,2599,10.947275955606203
1848,2600,10.635270124233982
1848,2601,11.916564552040725
1848,2602,12.119810736845844
1848,2603,12.406661156256154
1848,2604,10.636275056472996
1848,2605,12.549890992708612
1848,2606,9.783802450936204
1848,2607,11.253697489670264
1848,2608,12.16385432290674
1848,2609,10.30355814063016
1848,2610,12.102525596913923
1848,2611,11.636595992818505
1848,2612,10.741178028606866
1848,2613,11.352414275107423
1848,2614,12.204860161717253
1848,2615,12.959915468475387
1848,2616,11.320652192610872

Malheureusement, 1848 apparaît aussi parfois dans la troisième colonne et je dois l'ignorer :

6687,8963,9.241848677632822
6687,9111,10.537325656184889
6687,9506,11.315629894841848

7voto

Cyrus Points 4962

Avec GNU sort :

grep -E '(^1848|^[0-9]{4},1848)' file | sort -t, -k3n | head -n 5

(si la première colonne peut avoir moins ou plus de 4 chiffres exactement, remplacez {4} con + )

Output:

1848,2606,9.783802450936204
1848,2609,10.30355814063016
1848,2600,10.635270124233982
1848,2604,10.636275056472996
1848,2612,10.741178028606866

6voto

heemayl Points 85741

Avec seulement awk :

awk -F, 'BEGIN{PROCINFO["sorted_in"]="@ind_num_asc"} \
          $1==1848||$2==1848 {a[$3]=$0} END {for(i in a) print a[i]}' file.csv
  • BEGIN{PROCINFO["sorted_in"]="@ind_num_asc"} définit l'ordre de tout tableau qui sera créé en fonction de l'index, selon les chiffres, dans un style ascendant

  • $1==1848||$2==1848 {a[$3]=$0} vérifie si le premier ou le deuxième champ est 1848, si oui, alors le troisième champ ( $3 ) est considéré comme un tableau a la valeur étant l'enregistrement entier ( $0 )

  • Dans le END {for(i in a) print a[i]} nous allons simplement itérer sur les clés et imprimer les valeurs.

Pour obtenir seulement les 5 enregistrements, ajoutez head -5 à la fin :

awk ... | head -5

Par souci d'exhaustivité, il est évident que vous pouvez obtenir uniquement les 5 premiers enregistrements en incorporant un minuscule break logique dans le END en boucle, pas besoin de tail :

awk -F, 'BEGIN{PROCINFO["sorted_in"]="@ind_num_asc"} \
          $1==1848||$2==1848 {a[$3]=$0} END {j=0; for(i in a) \
           {print a[i]; j++; if(j==5) break}}' file.csv

Exemple :

% cat file.txt
1848,2598,11.310694021273559
1848,2599,10.947275955606203
1848,2600,10.635270124233982
1848,2601,11.916564552040725
1848,2602,12.119810736845844
1848,2603,12.406661156256154
1848,2604,10.636275056472996
1848,2605,12.549890992708612
1848,2606,9.783802450936204
1848,2607,11.253697489670264
1848,2608,12.16385432290674
1848,2609,10.30355814063016
1848,2610,12.102525596913923
1848,2611,11.636595992818505
1848,2612,10.741178028606866
1848,2613,11.352414275107423
1848,2614,12.204860161717253
1848,2615,12.959915468475387
1848,2616,11.320652192610872

% awk -F, 'BEGIN{PROCINFO["sorted_in"]="@ind_num_asc"} $1==1848||$2==1848 {a[$3]=$0} END {for(i in a) print a[i]}' file.txt
1848,2606,9.783802450936204
1848,2609,10.30355814063016
1848,2600,10.635270124233982
1848,2604,10.636275056472996
1848,2612,10.741178028606866
1848,2599,10.947275955606203
1848,2607,11.253697489670264
1848,2598,11.310694021273559
1848,2616,11.320652192610872
1848,2613,11.352414275107423
1848,2611,11.636595992818505
1848,2601,11.916564552040725
1848,2610,12.102525596913923
1848,2602,12.119810736845844
1848,2608,12.16385432290674
1848,2614,12.204860161717253
1848,2603,12.406661156256154
1848,2605,12.549890992708612
1848,2615,12.959915468475387

% awk -F, 'BEGIN{PROCINFO["sorted_in"]="@ind_num_asc"} $1==1848||$2==1848 {a[$3]=$0} END {j=0; for(i in a) {print a[i]; j++; if(j==5) break}}' file.txt 
1848,2606,9.783802450936204
1848,2609,10.30355814063016
1848,2600,10.635270124233982
1848,2604,10.636275056472996
1848,2612,10.741178028606866

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X