使用awk更改文本文件格式

使用awk更改文本文件格式,awk,Awk,我有一个类似以下示例的文本文件: chr10:100007446-100008677 153 154 chr8:100007446-100008677 165 166 chr6:100007446-100008677 170 171 chr1:100007446-100008677 2 3 我想更改文件中的某些元素 在输入文件中,列以选项卡分隔 在第一列中,我只想保留“chr”及其后的数字,如下面的输出 2nd列是“第1列中“:”之后的第一个数字”加上相应行第2列中的

我有一个类似以下示例的文本文件:

chr10:100007446-100008677   153 154
chr8:100007446-100008677    165 166
chr6:100007446-100008677    170 171
chr1:100007446-100008677    2   3
我想更改文件中的某些元素

  • 在输入文件中,列以选项卡分隔
  • 在第一列中,我只想保留
    “chr”
    及其后的数字,如下面的输出
  • 2nd
    列是
    “第1列中“:”之后的第一个数字”
    加上相应行第2列中的数字
  • 第三列的
    “第二列中的新数字+1”
    以下是预期输出的一个小示例:

    chr10   100007599   100007600
    chr8    100007611   100007612
    chr6    100007616   100007617
    chr1    100007448   100007449
    
  • 我在
    awk
    中编写了以下代码:

    awk -F "\t"":""-" ' {print $1 = $1,  print $2 = $2+4, print $2 = $2+$4+1}' file.txt > out.txt
    

    但它没有返回我想要的。您知道如何修复它吗?

    下面的
    awk
    可能会有帮助

    awk '{split($0,a,"[:-]");print a[1],a[2]+$2,a[2]+$2+1}'  Input_file
    
    解决方案二:


    这应该能奏效

    awk -F ":|-|[[:blank:]]*" '{print $1,$2+$4,$2+$4+1}' file
    
    这将产生:

    chr10 100007599 100007600
    chr8 100007611 100007612
    chr6 100007616 100007617
    chr1 100007448 100007449
    
    如果希望输出以制表符分隔,可以使用(根据William Pursell的建议)

    这导致:

    chr10   100007599       100007600
    chr8    100007611       100007612
    chr6    100007616       100007617
    chr1    100007448       100007449
    
    注意:因此不允许逐字显示制表符

    此外,如果您确定输入仅包含制表符而不包含空格,则可以使用
    -F:|-|t“
    定义字段分隔符


    备注:注意标签是邪恶的。它们可以被认为是很好的字段分隔符,但当您在编辑器或屏幕上可视化它时,一切都取决于系统如何解释选项卡的宽度。是4、8还是17?

    只需要s='\t'(我想我是在解释“输入文件中的列是制表符分隔的”,意思是所需的输出包含制表符…)@williampersell我已经相应地更新了答案。
    $ awk -F'[-:\t]' -v OFS='\t' '{t=$2+$4; print $1, t, t+1}' file
    chr10   100007599       100007600
    chr8    100007611       100007612
    chr6    100007616       100007617
    chr1    100007448       100007449
    
    awk 'BEGIN{FS=":|-|[[:blank:]]*";OFS="\t"}
         {print $1,$2+$4,$2+$4+1}' file
    
    chr10   100007599       100007600
    chr8    100007611       100007612
    chr6    100007616       100007617
    chr1    100007448       100007449
    
    $ awk -F'[-:\t]' -v OFS='\t' '{t=$2+$4; print $1, t, t+1}' file
    chr10   100007599       100007600
    chr8    100007611       100007612
    chr6    100007616       100007617
    chr1    100007448       100007449