如何仅在特定条件(上下文)下使用另一个字段的值更新列中字段的值?

2024-06-25 06:33:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件,当一个特定列的第一个字段(比如1和2)的第五个字段中有一个上下文(管道即|)时,我想在其中更新该列第一个字段中的值。你知道吗

我可以使用python,但是拆分行、替换值并连接它们将是一个很长的脚本。我正在寻找一个解决方案使用awk(pefereable)其他人也很好,是短。我还想把它嵌入到python脚本中。你知道吗

下面是“我的数据”中的两列,其中的字段以(:)分隔。

0/1:42,19:61:99:0|1:5185_T_TTCTATC:560,0,1648       0/1:38,34:72:99:0|1:5185_T_TTCTATC:1145,0,1311

0/0:124,0,0:124:99:0,120,1800,120,1800,1800    0/0:165,0,0:165:99:0,120,1800,120,1800,1800

0/0:152,0:152:99:.:.:0,120,1800    0/1:145,34:179:99:0|1:5398_A_G:973,0,6088

因此,当该列中的第5个字段有“|”时,我们用第5个字段值更新第一个字段。

预期结果:

0|1:42,19:61:99:0|1:5185_T_TTCTATC:560,0,1648       0|1:38,34:72:99:0|1:5185_T_TTCTATC:1145,0,1311

0/0:124,0,0:124:99:0,120,1800,120,1800,1800    0/0:165,0,0:165:99:0,120,1800,120,1800,1800

0/0:152,0:152:99:.:.:0,120,1800    0|1:145,34:179:99:0|1:5398_A_G:973,0,6088

-实际上,有很多专栏。并且,假设这种列出现在第5个python索引位置之后,我想在第5个列之后的每个列字段中进行替换,如何处理这个问题。你知道吗

谢谢你

谢谢你


Tags: 文件数据脚本管道解决方案段值awk专栏
1条回答
网友
1楼 · 发布于 2024-06-25 06:33:06
$ awk '{ for (i=1;i<=NF;i++) { split($i,f,/:/); if (f[5]~/\|/) sub(/^[^:]+/,f[5],$i) } }1' file
0|1:42,19:61:99:0|1:5185_T_TTCTATC:560,0,1648 0|1:38,34:72:99:0|1:5185_T_TTCTATC:1145,0,1311
0/0:124,0,0:124:99:0,120,1800,120,1800,1800    0/0:165,0,0:165:99:0,120,1800,120,1800,1800
0/0:152,0:152:99:.:.:0,120,1800 0|1:145,34:179:99:0|1:5398_A_G:973,0,6088

唯一需要注意的是,第5个子字段不能包含&,因为这将是sub()中的反向引用元字符。你知道吗

如果要在第5列开始替换,请在loop init部分将i=1更改为i=5。你知道吗

分成几行:

$ awk '{
    for (i=1;i<=NF;i++) {
        split($i,f,/:/)
        if (f[5]~/\|/)
            sub(/^[^:]+/,f[5],$i)
    }
}1' file

相关问题 更多 >