[英]How to compare multiple columns in two files and retrieve the corresponding value from another column if match found
[英]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.