Используя AWK, чтобы найти наименьшее и наибольшее число в столбце? - PullRequest
11 голосов
/ 22 декабря 2011

Если у меня есть файл с несколькими столбцами, и я хочу использовать команду AWK, чтобы показать наибольшее и наименьшее число в конкретном столбце!

пример:

a  212
b  323
c  23
d  45
e  54
f  102

Iхочу, чтобы моя команда показала, что наименьшее число равно 23, а другая команда говорит, что наибольшее число равно 323

Я понятия не имею, почему ответы не работают!Я поместил более реалистичный пример моего файла (может быть, я должен упомянуть, что он определен с помощью табуляции)

##FORMAT=<ID=DP,Number=1,Type=Integer,Description="# high-quality bases">
##FORMAT=<ID=SP,Number=1,Type=Integer,Description="Phred-scaled strand bias P-value">
##FORMAT=<ID=PL,Number=-1,Type=Integer,Description="List of Phred-scaled genotype likelihoods, number of values is (#ALT+1)*(#ALT+2)/2">
#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  rmdup_wl_25248.bam
Chr10   247     .       T       C       7.8     .       DP=37;AF1=0.5;CI95=0.5,0.5;DP4=7,1,19,0;MQ=15;FQ=6.38;PV4=0.3,1,0.038,1 GT:PL:GQ        0/1:37,0,34:36
Chr10   447     .       A       C       75      .       DP=30;AF1=1;CI95=1,1;DP4=0,0,22,5;MQ=14;FQ=-108 GT:PL:GQ        1/1:108,81,0:99
Chr10   449     .       G       C       35.2    .       DP=33;AF1=1;CI95=0.5,1;DP4=3,2,20,3;MQ=14;FQ=-44;PV4=0.21,1.7e-06,1,0.34        GT:PL:GQ        1/1:68,17,0:31
Chr10   517     .       G       A       222     .       DP=197;AF1=1;CI95=1,1;DP4=0,0,128,62;MQ=24;FQ=-282      GT:PL:GQ        1/1:255,255,0:99
Chr10   761     .       G       A       27      .       DP=185;AF1=0.5;CI95=0.5,0.5;DP4=24,71,8,54;MQ=20;FQ=30;PV4=0.07,8.4e-50,1,1     GT:PL:GQ        0/1:57,0,149:60
Chr10   1829    .       A       G       3.01    .       DP=74;AF1=0.4998;CI95=0.5,0.5;DP4=18,0,54,0;MQ=19;FQ=4.68;PV4=1,9.1e-12,0.003,1 GT:PL:GQ        0/1:30,0,45:28

Я должен сказать, что я уже добавил исключающую строку, начинающуюся с #, поэтому эту команду я использую:

awk '$1 !~/#/' | awk -F'\t' 'BEGIN{first=1;} {if (first) { max = min = $6; first = 0; next;} if (max < $6) max=$6; if (min > $6) min=$6; } END { print min, max }' wl_25210_filtered.vcf

awk '$1 !~/#/' | awk -F'\t' 'BEGIN{getline;min=max=$6} NF{ max=(max>$6)?max:$6 min=(min>$6)?$6:min} END{print min,max}' wl_25210_filtered.vcf

и

awk '$1 !~/#/' | awk -F'\t' '
NR==2{min=max=$6;next}
NR>2 && NF{
    max=(max>$6)?max:$6
    min=(min>$6)?$6:min
}
END{print min,max}' wl_25210_filtered.vcf

Ответы [ 6 ]

6 голосов
/ 22 декабря 2011

Если ваш файл содержит пустые строки, ни одно из опубликованных решений не будет работать.Для правильной обработки пустых строк попробуйте это:

$ cat f.awk
BEGIN{getline;min=max=$6}
NF{
    max=(max>$6)?max:$6
    min=(min>$6)?$6:min
}
END{print min,max} 

Затем выполните эту команду:

sed "/^#/d" my_file | awk -f f.awk

Сначала она ловит первую строку файла, чтобы установить min и max.Затем для каждой непустой строки используется троичный оператор проверки, найден ли новый минимум или максимум.В конце результат печатается.

HTH Крис

4 голосов
/ 22 декабря 2011

Вы можете создать две пользовательские функции и использовать их в соответствии с вашими потребностями. Это предложит более общее решение.

[jaypal:~/Temp] cat file
a  212
b  323
c  23
d  45
e  54
f  102
[jaypal:~/Temp] awk '
function max(x){i=0;for(val in x){if(i<=x[val]){i=x[val];}}return i;}
function min(x){i=max(x);for(val in x){if(i>x[val]){i=x[val];}}return i;}
{a[$2]=$2;next}
END{minimum=min(a);maximum=max(a);print "Maximum = "maximum " and Minimum = "minimum}' file
Maximum = 323 and Minimum = 23

В приведенном выше решении есть две пользовательские функции - max и min. Мы храним столбец 2 в массиве. Вы можете хранить каждый из ваших столбцов, как это. В операторе END вы можете вызвать функцию, сохранить значение в переменной и распечатать его.

Надеюсь, это поможет!

Обновление:

Выполнено следующее в соответствии с последним примером -

[jaypal:~/Temp] awk '
function max(x){i=0;for(val in x){if(i<=x[val]){i=x[val];}}return i;}
function min(x){i=max(x);for(val in x){if(i>x[val]){i=x[val];}}return i;}
/^#/{next}
{a[$6]=$6;next}
END{minimum=min(a);maximum=max(a);print "Maximum = "maximum " and Minimum = "minimum}' sample
Maximum = 222 and Minimum = 3.01
2 голосов
/ 23 января 2012
awk 'BEGIN {max = 0} {if ($6>max) max=$6} END {print max}' yourfile.txt
1 голос
/ 20 июня 2012

Мин можно найти по:

awk 'BEGIN {min=1000000; max=0;}; { if($2<min && $2 != "") min = $2; if($2>max && $2 != "") max = $2; } END {print min, max}' file

Выводит минимальное и максимальное значения, разделенные запятыми

1 голос
/ 22 декабря 2011

Используйте блоки BEGIN и END для инициализации и печати переменных, которые отслеживают минимальное и максимальное значения.

например.,

awk 'BEGIN{max=0;min=512} { if (max < $1){ max = $1 }; if(min > $1){ min = $1 } } END{ print max, min}'
1 голос
/ 22 декабря 2011
awk 'BEGIN{first=1;} 
     {if (first) { max = min = $2; first = 0; next;}
      if (max < $2) max=$2; if (min > $2) min=$2; }
     END { print min, max }' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...