我有一个由制表符分隔的文件,如下所示:
input_sequence match_sequence score receptor_group epitope antigen organism
ASRPPGGVNEQF ASRPPGGVNEQF 1.00 25735 EPLPQGQLTAY surface glycoprotein [Severe acute respiratory syndrome coronavirus 2] SARS-CoV2
ASSYSGGYEQY ASSYSGGYEQY 1.00 33843 KTAYSHLSTSK polymerase Hepatitis B virus (hepatitis B virus (HBV))
ASSYSGGYEQY ASSYSGGYEQY 1.00 131430 KLSYGIATV orf1ab polyprotein [Severe acute respiratory syndrome coronavirus 2] SARS-CoV2
ASSYSGGYEQY ASSFSGGYEQY 0.97 82603 FTISVTTEIL surface glycoprotein [Severe acute respiratory syndrome coronavirus 2] SARS-CoV2
ASSYSGGYEQY ASSYAGGYEQY 0.98 133155 FVCNLLLLFVTVYSHLLLV ORF3a protein [Severe acute respiratory syndrome coronavirus 2] SARS-CoV2
ASSLFGSTDTQY ASSLFGSTDTQY 1.00 92508 FTISVTTEIL surface glycoprotein [Severe acute respiratory syndrome coronavirus 2] SARS-CoV2我想保持'input_sequence‘只与’有机体‘=非典-CoV2 2,而不是其他。所以在这个例子中,我只保留第2行和第7行,放弃第3行、第4行、第5行和第6行,因为这里的'input_sequence‘也有乙型肝炎病毒的流行。
总共有20.000多行在我的文件中。
所需成果:
input_sequence match_sequence score receptor_group epitope antigen organism
ASRPPGGVNEQF ASRPPGGVNEQF 1.00 25735 EPLPQGQLTAY surface glycoprotein [Severe acute respiratory syndrome coronavirus 2] SARS-CoV2
ASSLFGSTDTQY ASSLFGSTDTQY 1.00 92508 FTISVTTEIL surface glycoprotein [Severe acute respiratory syndrome coronavirus 2] SARS-CoV2是否有一种使用awk或bash (无需编写长脚本)快速完成此操作的方法?任何小费都欢迎。
我想用awk来统计第1栏中的每个值的发生,第7栏中出现的SARS 2,然后只保留那些匹配的.但我不知道该怎么做。我只做到了这一点(计算第一列中出现的次数):
awk '{for(i=1;i<=NF;i++)if($i ~ /^/)x++;print x;x=0}' file谢谢!
发布于 2022-02-10 17:17:20
awk '
NR==1 # Print first line (header)
$NF != "SARS-CoV2" { bad[$1] } # Collect primary keys of "bad" records based on content in last field
$NF == "SARS-CoV2" { good[$1]=$0 } # Collect primary keys of "good" records with opposite check
END {
for(v in bad) delete good[v] # Remove primary keys from "good" records that also appear in "bad" records
for(v in good) print good[v] # Print the "good" rows
}
' file将文件传递一次,这可能是一种解决方案。这将删除任何重复的条目。
发布于 2022-02-10 18:18:11
您可以考虑将这个awk连接到第1列上的同一个文件:
awk -F'\t' 'NR==FNR {$NF != "SARS-CoV2" && bad[$1]; next}
FNR == 1 || !($1 in bad)' file{,} | column -s $'\t' -t
input_sequence match_sequence score receptor_group epitope antigen organism
ASRPPGGVNEQF ASRPPGGVNEQF 1.00 25735 EPLPQGQLTAY Trans-activator protein BZLF1 [Severe acute respiratory syndrome coronavirus 2] SARS-CoV2
ASSLFGSTDTQY ASSLFGSTDTQY 1.00 92508 FTISVTTEIL surface glycoprotein [Severe acute respiratory syndrome coronavirus 2] SARS-CoV2PS:column -s $'\t' -t仅用于表格显示。你可以把它移走。
如果要根据第一栏取消会费,请使用:
awk -F'\t' 'NR==FNR {$NF != "SARS-CoV2" && bad[$1]; next}
FNR == 1 || (!($1 in bad) && !seen[$1]++)' file{,}发布于 2022-02-10 17:57:23
您需要对输入进行两次传递。
第一次遍历生成一个数组,其键是输入序列,该序列具有SARS-CoV2以外的有机体。第二次传递检查当前输入序列是否在该数组中。如果没有,它就会打印出线。
awk -F'\t' 'NR==FNR {if ($7 != "SARS-CoV2") {a[$0]=1}; next}
!a[$0]' file filehttps://stackoverflow.com/questions/71069288
复制相似问题