【问题标题】:changing text file format using awk使用 awk 更改文本文件格式
【发布时间】:2018-04-07 00:21:09
【问题描述】:

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

chr10:100007446-100008677   153 154
chr8:100007446-100008677    165 166
chr6:100007446-100008677    170 171
chr1:100007446-100008677    2   3

我想更改文件中的一些元素。

  1. 在输入文件中,列是制表符分隔的
  2. 在第一列中,我只想保留 "chr" 和之后的数字,如下面的输出所示
  3. 2nd 列是"the 1st number just after ':' in the 1st column" 加上对应行第二列的数字。
  4. 3rd 列是 "the new number in the 2nd column + 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


    【解决方案1】:

    这应该可以解决问题

    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 的建议)

    awk -F ":|-|[[:blank:]]*" '{print $1,$2+$4,$2+$4+1}' OFS="\t" file
    

    或

    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
    

    注意:SO 不允许逐字使用制表符

    此外,如果您确定输入中只包含制表符而没有空格,则可以使用-F ":|-|\t" 来定义字段分隔符。

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

    【讨论】:

    • 只需要OFS='\t'
    • (我想我是在解释“在输入文件中,列是制表符分隔的”意味着所需的输出包含制表符......)
    • @WilliamPursell 我已经相应地更新了答案。
    【解决方案2】:

    关注awk 可能会有所帮助。

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

    解决方案二:

    awk -F":|-| +" '{print $1,$2+$4,$2+$4+1}'  Input_file
    

    【讨论】:

      【解决方案3】:
      $ 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-29
        • 2014-06-22
        • 2012-04-17
        • 1970-01-01
        • 2014-11-17
        • 2019-04-20
        • 1970-01-01
        相关资源
        最近更新 更多