使用awk更改文本文件格式

时间:2018-04-06 14:29:52

标签: awk

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

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

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

  1. 在输入文件中,列以制表符分隔
  2. 第一栏中的
  3. 我只想保留"chr"和之后的数字,如下面的输出
  4. 2nd列为"the 1st number just after ':' in the 1st column"加上相应行第二列中的数字。
  5. 3rd列为"the new number in the 2nd column + 1" 这是预期输出的一个小例子:

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

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

    但它没有返回我想要的东西。你知道怎么解决吗?

3 个答案:

答案 0 :(得分:2)

这应该可以解决问题

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吗?

答案 1 :(得分:1)

关注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

答案 2 :(得分:0)

$ 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