我有一个文本文件,如下例所示:
chr10:100007446-100008677 153 154
chr8:100007446-100008677 165 166
chr6:100007446-100008677 170 171
chr1:100007446-100008677 2 3
我想更改文件中的一些元素。
"chr"
和之后的数字,如下面的输出2nd
列为"the 1st number just after ':' in the 1st column"
加上相应行第二列中的数字。 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
但它没有返回我想要的东西。你知道怎么解决吗?
答案 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