簡體   English   中英

比較單個文件中的多列,以計算這些列中值的出現

[英]Compare multiple columns from a single file an count the occurrence of a value in these columns

我有一個21列的文件;

Name    Grade1    Grade2   Grade3   Grade4   Grade5  .... Grade20
Zoe       60        70      NA       NA        NA            67

現在,我只想保留不超過5個等級的名稱。 有些名稱包含NA。

我知道awk可以勝任。 但是我不確定如何比較所有列而不必分別比較它們。

我試過了:

    more input_file.txt | awk 'total = count20[$2,$3,$4,$5,$6,$7,$8,$9,$10,
    $11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21]++, if (($2 == "NA" || $3 == "NA" || 
    $4 == "NA" || $5 == "NA" || $6 == "NA" || $7 == "NA" || $8 == "NA" || $9 == "NA" 
    || $10 == "NA" || $11 == "NA" || $12 == "NA" || $13 == "NA" || $14 == "NA" || 
    $15 == "NA" || $16 == "NA" || $17 == "NA" || $18 == "NA" || $19 == "NA" || 
    $20 == "NA" || $21 == "NA") && total > 4) { print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"
    $6"\t"$7"\t"$8"\t"$9"\t"$10"\t"$11"\t"$12"\t"$13"\t"$14"\t"$15"\t"$16"\t"$17"\t"
    $18"\t"$19"\t"$20"\t"$21 }' > test.txt

它不起作用,我不確定為什么或如何更有效地做到這一點。

編輯:更准確地說,所需的輸出是一個包含名稱的文件,所有學生的所有列都包含5個以上不包含NA的列。

awk解救!

$ awk -F'NA' 'NF>5'

假設您的姓名列不包含NA作為子字符串。 使用NA作為字段定界符並計數字段,如果有5個以上的字段表示至少5個NA,則默認操作是打印該行,因此無需指定。 這將為您提供具有5個或更多NA的記錄,如果您希望嚴格大於5,則將閾值更改為6。

此命令至少會打印包含NA所有行六次:

grep -E '(NA.*){6}' infile

如果學生姓名也包含NA ,則可以將其絆倒。 要解決此問題,您可以使用

grep -E '^[^[:blank:]]+[[:blank:]]+(NA.*){6,}' infile

第一列之后計算NA

這是使用awk的一種相當基本的方法:

awk '{ count = 0; for (i = 2; i <= NF; ++i) if ($i == "NA") ++count } count > 5' file

這遍歷每個字段並檢查它是否等於“ NA”。 如果是這樣,它將添加到該記錄的總數中。 當計數大於5時,將打印記錄。

它被標記為perl所以一個perl回答:

perl -ne 'print if (grep /^NA$/, split ) > 5'

哪一個:

  • 逐行迭代
  • 進行空格分割
  • 只是 NA字段
  • 如果計數> 5 ,則打印

使用GNU awk作為單詞邊界:

awk -F'\\<NA\\>' 'NF>6'

如果您的字段用制表符分隔,則使用awk,如下所示:

awk -F'\tNA(\t|$)' 'NF>6'

與任何POSIX awk字段之間的任何類型的空間:

awk -F'[[:space:]]NA([[:space:]]|$)' 'NF>6'

在Perl中,只需計算等於NA的字段數

perl -ne 'print if 5 <= grep { $_ eq "NA" } split' test.txt

或者,正如湯姆·費內奇(Tom Fenech)在評論中指出的那樣

perl -ane 'print if 5 <= grep { $_ eq "NA" } @F' test.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM