0

1列のファイルがあり、次のようになります。

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

使用する1つの方法GNU sed

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

結果:

chr1
        C1orf122
        YRDC
chr1
chr1
chr1
chr1
        NADK
chr1
chr1

(実際には2つのタブがあります)。-iフラグを追加すると、 in_placeで変更を加えることができ、一時ファイルを使用する必要がなくなります。

于 2012-10-09T11:48:32.503 に答える
1

ここで動作するプログラムにいくつかコメントがあります(GNU awk):

  • $1 ~ /chr*/chor chror chrretc を最初のフィールドで検索しようとします。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
于 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 に答える