正在尝试使用该文件...
MT 200610-1 100 2757
MT 200610-10 100 6753
MT 200610-100 100 15173
想要使用第 1、2 和 4 列创建一个如下所示的新文件...
chrMT 2756 2757 200610-1
chrMT 6752 6753 200610-10
chrMT 15172 15173 200610-100
如果我只做前三个这样它就可以了..
awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4}' test_ace_geno1.map
chrMT 2756 2757
chrMT 6752 6753
chrMT 15172 15173
如果我尝试在最后添加第二列,则会发生一些奇怪的事情......
awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4,$2}' test_ace_geno1.map
200610-16 2757
200610-10 6753
200610-100 15173
如果我使用设置列表执行 vim,它会显示它是一个常规选项卡,所以我不确定该列发生了什么,导致整个事情变得混乱。
MT^I200610-1^I100^I2757$
MT^I200610-10^I100^I6753$
MT^I200610-100^I100^I15173$
答案1
带有dos
样式行结尾:
$ cat -e ip.txt
MT 200610-1 100 2757^M$
MT 200610-10 100 6753 ^M$
MT 200610-100 100 15173^M$
$ awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4}' ip.txt
chrMT 2756 2757
chrMT 6752 6753
chrMT 15172 15173
$ awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4,$2}' ip.txt
200610-16 2757
chrMT 6752 6753 200610-10
200610-100 15173
用于perl
处理dos
样式行结束和获取所需的输出:
$ perl -lane 'print "chr$F[0]\t", $F[3]-1, "\t$F[3]\t$F[1]"' ip.txt
chrMT 2756 2757 200610-1
chrMT 6752 6753 200610-10
chrMT 15172 15173 200610-100
使用awk
,首先将行尾更改为unix
样式,dos2unix
如果可用,则使用 或使用perl
$ perl -i -pe 's|\r\n|\n|' ip.txt
$ cat -e ip.txt
MT 200610-1 100 2757$
MT 200610-10 100 6753 $
MT 200610-100 100 15173$
进而
$ awk -v OFS='\t' '{print "chr"$1,$4-1,$4,$2}' ip.txt
chrMT 2756 2757 200610-1
chrMT 6752 6753 200610-10
chrMT 15172 15173 200610-100
或者,使用GNU awk
,设置输入记录来处理 dos 风格的行结尾
gawk -v RS='\r\n' -v OFS='\t' '{print "chr"$1,$4-1,$4,$2}' ip.txt
答案2
将语句中的所有内容以所需的格式放入print
,并执行任何必要的操作,例如减法$NF - 1
:
awk '{print "chr" $1, ($NF - 1), $NF, $2}' file.txt
显然,您可以使用$4
而不是$NF
在这里,但由于第四个字段是最后一个字段,因此它们都将指向同一字段。
例子:
% awk '{print "chr" $1, ($NF - 1), $NF, $2}' file.txt
chrMT 2756 2757 200610-1
chrMT 6752 6753 200610-10
chrMT 15172 15173 200610-100