我有一个包含一列的文件,看起来像这样。
chr1
C1orf122
YRDC
chr1
chr1
chr1
chr1
NADK
chr1
chr1
如果不以chr。
开头,我想在第一列中移动数据2选项卡预期产出
chr1
C1orf122
YRDC
chr1
chr1
chr1
chr1
NADK
chr1
chr1
我这样做
awk '{if($1 ~ /chr*/) print $_ ; else print "\t\t" $1}' <result >temp
数据不会移动2个标签:(
请帮忙
谢谢
答案 0 :(得分:1)
使用GNU sed
的一种方式:
sed '/^chr/!s/.*/\t\t&/' file.txt
结果:
chr1
C1orf122
YRDC
chr1
chr1
chr1
chr1
NADK
chr1
chr1
(实际上有两个标签)。如果添加-i
标记,则可以进行更改 in_place ,并避免使用临时文件。
答案 1 :(得分:1)
我对你的程序有一些评论,这可以在这里工作btw(GNU awk):
$1 ~ /chr*/
尝试在第一个字段中找到ch
或chr
或chrr
等。如果您的意思是chr
后跟任何内容使用chr.*
,如果它应该固定在字段的开头,请使用/^chr.*/
。$_
是一个perl变量,我认为awk假设你的意思是$0
,即整行(记录)。通常,如果您的代码块以if
开头,则可以将其设置为该块的条件,例如从:
$1 ~ /^chr.*/ { ... }
在你的情况下,如果行不是\t\t
,你想在chr
前面添加一行,我会这样表达:
$1 !~ /^chr.*/ { printf("\t\t") } 1
最后的1
打印$0
。
输出:
chr1
C1orf122
YRDC
chr1
chr1
chr1
chr1
NADK
chr1
chr1
答案 2 :(得分:0)
另一种解决方案:
awk '{$2=$1; sub($(!/chr1/),"",$1); sub($(/chr1/),"",$2); print $1 "\t\t" $2 }' file
结果:
awk '{$2=$1; sub($(!/chr1/),"",$1); sub($(/chr1/),"",$2); print $1 "\t\t" $2 }' file
chr1
C1orf122
YRDC
chr1
chr1
chr1
chr1
NADK
chr1
chr1