Поиск строк с наименьшим значением в их третьем столбце с результатами grep

У меня есть файл, который состоит из таких строк (другие числа включены). Это часть вывода

$ grep 1848 filename.csv

Как найти верхние 5 строк, которые имеют самый низкий третий столбец в файле .csv, учитывая, что 1848 находится либо в первом, либо в втором столбце? [ ! d1]

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

К сожалению, 1848 иногда появляется и в третьем столбце, и мне нужно игнорировать это:

6687,8963,9.241848677632822
6687,9111,10.537325656184889
6687,9506,11.315629894841848
1
задан 12 November 2016 в 11:08

1 ответ

С помощью только 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"} задает порядок любого массива, который будет создан в соответствии с индексом, в соответствии с цифрами, в порядке возрастания $1==1848||$2==1848 {a[$3]=$0} если первое или второе поле равно 1848, если это так, то третье поле ($3) принимается как индекс массива a, причем значение является всей записью ($0). В END {for(i in a) print a[i]} мы просто перебираем ключи и печатаем значения

Чтобы получить только 5 записей, добавьте head -5 в конец:

awk ... | head -5

Просто ради полноты вам может, очевидно, получить только первые 5 записей, включив в цикл END крошечную логику break, нет необходимости в 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

Пример:

% 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
6
ответ дан 23 May 2018 в 04:18

Другие вопросы по тегам:

Похожие вопросы: