2011-12-22 41 views
10

Nếu tôi có một tệp có vài cột và tôi muốn sử dụng lệnh AWK để hiển thị số lớn nhất và số thấp nhất trong một cột cụ thể!Sử dụng AWK để tìm số nhỏ nhất và lớn nhất trong một cột?

dụ:

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

Tôi muốn lệnh của tôi để chứng minh rằng số lượng thấp nhất là 23 và lệnh khác để nói rằng số cao nhất là 323

Tôi không có ý tưởng tại sao câu trả lời không làm việc ! Tôi đặt một ví dụ thực tế hơn về tập tin của tôi (có lẽ tôi nên đề cập đến đó là tab xác định)

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

tôi nên nói rằng tôi đã thêm trừ dòng bắt đầu bằng # vì vậy đây là lệnh mà tôi sử dụng:

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

vấn đề là tôi có thẻ trên đầu mỗi cột và khi tôi chạy tất cả các dòng mà bạn đã đưa ra. Tôi luôn nhận được thẻ in – mahmood

+0

Xem câu trả lời cập nhật của tôi và đăng một ví dụ tốt hơn vào lần sau. – Chris

+0

Kiểm tra câu trả lời cập nhật của tôi. –

Trả lời

4

Bạn có thể tạo hai hàm do người dùng xác định và sử dụng chúng theo nhu cầu của bạn. Điều này sẽ cung cấp giải pháp chung chung hơn.

[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 

Trong giải pháp trên, có 2 hàm do người dùng định nghĩa - maxmin. Chúng tôi lưu trữ cột 2 trong một mảng. Bạn có thể lưu trữ từng cột của bạn như thế này. Trong câu lệnh END, bạn có thể gọi hàm và lưu trữ giá trị trong một biến và in nó.

Hy vọng điều này sẽ hữu ích!

Cập nhật:

đã thi sau theo ví dụ mới nhất -

[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

đây là câu trả lời mà tôi nhận được khi tôi chạy nó cho tệp của tôi cho cột 6 tối đa = QUAL và tối thiểu = – mahmood

+0

vì vậy cột nào bạn muốn tối đa amd phút cho? Câu hỏi của bạn không đề cập đến nó. –

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

Đây là awk-ish: 'awk 'NR == 1 {phút = 2 đô la; tối đa = $ 2; tiếp theo} tối đa <$ 2 {max = $ 2} phút> $ 2 {min = $ 2} END {print min, max} 'file' –

+0

vấn đề là tôi có thẻ trên đầu mỗi cột và khi tôi chạy tất cả các dòng mà bạn những người đã cho. Tôi luôn nhận được thẻ in – mahmood

1

Sử dụng BEGINEND các khối để khởi tạo và in các biến theo dõi phút và tối đa.

ví dụ

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

Min của bạn sẽ không chính xác nếu tất cả các số đều là số âm và giá trị tối đa của bạn sẽ không chính xác nếu tất cả các số lớn hơn 512. – codaddict

+0

xem bài viết này về những gì "ví dụ" có nghĩa là: https://secure.wikimedia.org/wikipedia/en/wiki/E.g.#exempli_gratia tôi nghĩ rằng an toàn để cho phép op đưa ra quyết định về ưu tiên dữ liệu của anh ấy. –

+1

'print min max' sẽ xuất ra '23323' - bạn cần dấu phẩy trong đó. –

6

Nếu tập tin của bạn chứa dòng rỗng, không ai trong số các giải pháp được đăng sẽ làm việc. Khi phải xử lý đúng dòng rỗng thử điều này:

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

Sau đó chạy lệnh này:

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

Lúc đầu, nó bắt dòng đầu tiên của file để thiết lập min và max. Hơn đối với mỗi dòng không trống, nó sử dụng kiểm tra toán tử ternary, nếu tìm thấy min hoặc max mới. Vào cuối kết quả ist in.

HTH Chris

+0

vấn đề là tôi có thẻ trên đầu mỗi cột và khi tôi chạy tất cả các dòng mà bạn đã đưa ra. Tôi luôn luôn nhận được thẻ in – mahmood

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

min có thể được tìm thấy bằng cách:

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

chí này sản lượng tối thiểu và tối đa, được phân tách bằng dấu phẩy

Các vấn đề liên quan