0

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

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

请帮忙

谢谢

4

3 回答 3

1

一种使用方式GNU sed

sed '/^chr/!s/.*/\t\t&/' file.txt

结果:

chr1
        C1orf122
        YRDC
chr1
chr1
chr1
chr1
        NADK
chr1
chr1

(实际上有两个标签)。如果添加-i标志,则可以在_place进行更改并避免使用临时文件。

于 2012-10-09T11:48:32.503 回答
1

我对您的程序有几点评论,顺便说一句(GNU awk):

  • $1 ~ /chr*/尝试在第一个字段中查找chor chror等​​。chrr如果您的意思chr是使用任何内容chr.*,并且应该将其锚定在该字段的开头,请使用/^chr.*/.
  • $_是一个 perl 变量,我认为 awk 假设您的意思是$0,即整行(记录)。

通常,如果您的代码块以 an 开头,if您可以将其设置为该块的条件,例如以:

$1 ~ /^chr.*/ { ... }

\t\t在您的情况下,如果它不以 开头,您想在该行前面加上chr,我会这样表达:

$1 !~ /^chr.*/ { printf("\t\t") } 1

最后1打印$0.

输出:

chr1
        C1orf122
        YRDC
chr1
chr1
chr1
chr1
        NADK
chr1
chr1
于 2012-10-09T12:26:10.543 回答
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    
于 2012-10-10T12:38:34.657 回答