2011-12-22 2 views
10

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

пример:

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

Я хочу, чтобы моя команда, чтобы показать, что наименьшее число 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 
+0

проблема в том, что у меня есть тег поверх каждого столбца, и когда я запускаю все строки, которые вы, ребята, дали. Я всегда получаю тег напечатан – mahmood

+0

См. Мой обновленный ответ и отправьте лучший пример в следующий раз. – Chris

+0

Проверьте мой обновленный ответ. –

ответ

4

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

[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 

В приведенном выше решении, есть 2 пользовательские функции - 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 
+0

. Это ответ, который я получаю, когда я запускаю его для своего файла для столбца 6 Maximum = QUAL и Minimum = – mahmood

+0

, поэтому в каких столбцах вы хотите использовать max amd min? Ваш вопрос не упоминает об этом. –

1
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 
+1

Это больше awk-ish: 'awk 'NR == 1 {мин = $ 2; макс = $ 2; next} max <$ 2 {max = $ 2} min> $ 2 {min = $ 2} END {print min, max} 'file' –

+0

проблема в том, что у меня есть тег поверх каждого столбца, и когда я запускаю все строки, которые вы ребята дали. Я всегда получаю тег напечатан – mahmood

1

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

например,

awk 'BEGIN{max=0;min=512} { if (max < $1){ max = $1 }; if(min > $1){ min = $1 } } END{ print max, min}' 
+0

Ваш min был бы неправильным, если все числа были отрицательными, и ваш макс был бы неправильным, если все номера были больше 512. – codaddict

+0

см. Эту статью о том, что " означает: https://secure.wikimedia.org/wikipedia/en/wiki/E.g.#exempli_gratia Я думаю, что это безопасно, чтобы оп принял решение по априори своих данных. –

+1

'print min max' будет выводить' 23323' - вам нужна запятая. –

6

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

$ 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 

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

НТН Chris

+0

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

1
awk 'BEGIN {max = 0} {if ($6>max) max=$6} END {print max}' yourfile.txt 
1

Минимальное можно найти:

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

Это будет выводить минимальное и максимум, разделенные запятыми

Смежные вопросы