繁体   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