移动所选数据两个选项卡

时间:2012-10-09 11:16:37

标签: shell awk

我有一个包含一列的文件,看起来像这样。

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个标签:(

请帮忙

谢谢

3 个答案:

答案 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*/尝试在第一个字段中找到chchrchrr等。如果您的意思是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