使用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