从文件中提取数据并操作内容以写入新文件

ins*_*ess 2 awk text-processing bioinformatics

我有一个 csv 文件,我从中提取了与我相关的数据。这些一方面是参考编号,另一方面是字母 G、A、T 和 C 形式的遗传信息。

内容.csv:

1,S188823,188823,,,,ACTCTCGA,,CTGTACCA,ID23,
1,S189843,189843,,,,ACCCTGGA,,CTTGTACA,ID23,
...
Run Code Online (Sandbox Code Playgroud)

与我相关的信息是188823,,,,ACCCTGGA,,CTTGTACA 来自每一行。在此过程中必须删除重复项。前两行也必须被截断。

这就是我目前所做的:

cat File.csv | cut -d "," -f 3,9,7 | uniq | sed -e '1d' -e '2d'
Run Code Online (Sandbox Code Playgroud)

结果如下所示:

188823,ACTCTCGA,CTGTACCA
189843,ACCCTGGA,CTTGTACA
...
Run Code Online (Sandbox Code Playgroud)

但现在有两件事必须做,我没有做到。字段 3 和字段 2 必须交换

188823,CTGTACCA,ACTCTCGA
189843,CTTGTACA,ACCCTGGA
...
Run Code Online (Sandbox Code Playgroud)

现在从 field2 开始,碱基必须“反向互补”。这意味着每个 A 变成 T,每个 C 变成 G,每个 G 变成 C,每个 T 变成 A,序列顺序颠倒。于是,CTGTACCA变成TGGTACAG

最终结果必须如下所示:

188823,TGGTACAG,ACTCTCGA
188823,TGTACAAG,ACCCTGGA
Run Code Online (Sandbox Code Playgroud)

我希望这是可以理解的,你可以帮助我。可以在此处找到有关反向补充构建的一些帮助: revcomp builder online

αғs*_*нιη 5

使用 GNU awk

awk -F, '!seen[$3 FS $9 FS $7]++ {
    cmd="echo \047" $9 "\047 | rev | tr ATCG TAGC";
    if ((cmd |getline $9)>0){ print $3, $9, $7; };
    close(cmd);
}' OFS=, infile
Run Code Online (Sandbox Code Playgroud)

输出:

188823,TGGTACAG,ACTCTCGA
189843,TGTACAAG,ACCCTGGA
Run Code Online (Sandbox Code Playgroud)

添加NR>2到命令中,例如awk 'NR>2{ ...; }'从输入中跳过前两行。

这里我们使用了 [ getlineinto a Variable from a Pipe ] 和预定义的命令 in cmd="..." $9 "..." (注意我们只将与外部命令相关的东西放在双引号内),然后从 Pipe to 调用它getline并将结果保存到同一$9字段中;如果getline结果成功,我们将在输出中打印所需的字段。

最后我们应该关闭(cmd我们打开的命令

!seen[$3 FS $9 FS $7]++ 用于忽略处理字段 #3、#9 和 #7 上的重复行。