在awk中处理文本文件并生成新文件

在awk中处理文本文件并生成新文件,awk,Awk,我有一个文本文件,如以下小示例: chr10:102721669-102724893 3217 3218 5 chr10:102721669-102724893 3218 3219 1 chr10:102721669-102724893 3219 3220 5 chr10:102721669-102724893 421 422 1 chr10:102721669-102724893 858 859 2 chr10:102539319-102

我有一个文本文件,如以下小示例:

chr10:102721669-102724893   3217    3218    5
chr10:102721669-102724893   3218    3219    1
chr10:102721669-102724893   3219    3220    5
chr10:102721669-102724893   421 422 1
chr10:102721669-102724893   858 859 2
chr10:102539319-102568941   13921   13922   1
chr10:102587299-102589074   1560    1561    1
chr10:102587299-102589074   1565    1566    1
chr10:102587299-102589074   1595    1596    1
chr10:102587299-102589074   944 945 1
预期输出如下所示:

chr10:102721669-102724893   3217    3218    5   CA
chr10:102721669-102724893   3218    3219    1   CA
chr10:102721669-102724893   3219    3220    5   CA
chr10:102721669-102724893   421 422 1   BA
chr10:102721669-102724893   858 859 2   BA
chr10:102539319-102568941   13921   13922   1   NON
chr10:102587299-102589074   1560    1561    1   CA  
chr10:102587299-102589074   1565    1566    1   CA
chr10:102587299-102589074   1595    1596    1   CA
chr10:102587299-102589074   944 945 1   BA
输入有
4个选项卡分隔的
列,而在输出中,我又有一个列,包含3个不同的类(
CA、NON或BA
)。 1-如果输入中的
第1列
未重复,则在输出的
第5列
中,它将被分类为非 2-如果
(紧跟在“:”(在第一列)+第二列中)之后的数字“-”(在第一列中)小于-30(表示-31或更小),则该行将被归类为BA
。例如,在最后一行:
(102587299+944)-102589074=-831,因此此行被归类为BA

3-如果
(紧跟在“:”之后的数字)(在第1列)+第2列)-紧跟在“-”(在第1列)之后的数字等于或大于-30(意思是-30或-29),则该行将被归类为CA
。例如,第1行:

(102721669 + 3217) - 102724893 = -7
我正在
awk
中尝试这样做

awk -F "\t"":""-" '{if($2+$4-$3 < -30) ; print $7 = BA,  if($2+$4-$3 >= -30) ; print $7 = CA}' file.txt > out.txt
awk-F“\t”:“-”{if($2+$4-$3<-30);print$7=BA,if($2+$4-$3>=-30);print$7=CA}”file.txt>out.txt
但它并没有回报我所期望的。你知道怎么修吗?

试试看

$ awk 'BEGIN{FS=OFS="\t"} NR==FNR{a[$1]++; next}
       { split($1, b, /[\t:-]/);
         $5 = a[$1]==1 ? "NON" : (b[2]+$2-b[3]) < -30 ? "BA" : "CA" }
       1' file.txt file.txt
chr10:102721669-102724893   3217    3218    5   CA
chr10:102721669-102724893   3218    3219    1   CA
chr10:102721669-102724893   3219    3220    5   CA
chr10:102721669-102724893   421 422 1   BA
chr10:102721669-102724893   858 859 2   BA
chr10:102539319-102568941   13921   13922   1   NON
chr10:102587299-102589074   1560    1561    1   BA
chr10:102587299-102589074   1565    1566    1   BA
chr10:102587299-102589074   1595    1596    1   BA
chr10:102587299-102589074   944 945 1   BA
$awk'BEGIN{FS=OFS=“\t”}NR==FNR{a[$1]++;next}
{拆分($1,b,/[\t:-]/);
$5=a[$1]==1?“非”:(b[2]+$2-b[3])<-30?“BA”:“CA”}
1'file.txt file.txt
chr10:102721669-102724893 3217 3218 5 CA
chr10:102721669-102724893 3218 3219 1加利福尼亚州
chr10:102721669-102724893 3219 3220 5 CA
chr10:102721669-102724893 421 422 1 BA
chr10:102721669-102724893 858 859 2 BA
chr10:102539319-102568941 13921 13922 1非
chr10:102587299-102589074 1560 1561 BA
chr10:102587299-102589074 1565 1566 1 BA
chr10:102587299-102589074 1595 1596 1 BA
chr10:102587299-102589074 944 945 1 BA
  • BEGIN{FS=OFS=“\t”}
    将两个输入/输出字段分隔符设置为tab
  • NR==FNR{a[$1]++;next}
    计算第一个字段在文件中出现的次数。输入文件被传递两次,所以在第二次传递时,我们可以根据计数做出决定
  • split($1,b,/[\t:-]/)
    进一步拆分第一列,结果保存在
    b
    数组中
  • 代码的其余部分根据给定的条件指定第5个字段,并打印修改后的行

进一步阅读