テキストファイルの列 i を増分番号で置換する

テキストファイルの列 i を増分番号で置換する

私はこれに非常に似たことをする必要があります連続インデックスで文字列を置換するただし、列に数字を追加する必要はなく、列全体を増分する数字に置き換える必要があります。次のようになります。

0   0   chr1    3000575 3000801 0   chr1    4340023 4340249 32  32  
0   0   chr1    3000641 3000801 -1  chr1    3311943 3311783 32  32  
0   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
0   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
0   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32

なる

0   0   chr1    3000575 3000801 0   chr1    4340023 4340249 32  32  
1   0   chr1    3000641 3000801 -1  chr1    3311943 3311783 32  32  
2   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
3   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
4   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32

(0から始まるか1から始まるかは関係ありません)

とてもバカな気がしますが、その質問の解決策を自分のケースに当てはめることはできません...

答え1

行に番号を付けるには、 を使用しますnl。列を削除するには (または、保持したい列をフィルターで除外するには)、 を使用しますcut

$ cut -f 2- cols.txt | nl
     1  0       chr1    3000575 3000801 0       chr1    4340023 4340249 32      32
     2  0       chr1    3000641 3000801 -1      chr1    3311943 3311783 32      32
     3  0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32
     4  0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32
     5  0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32

唯一の厄介な点nlは、行の先頭にスペース パディングが挿入されることです (デフォルトでは、行番号フィールドの幅は 6 文字ですが、行番号が切り捨てられるため、これを小さくすることは望ましくありません)。次のようにして、これらを取り除くことができます。

$ cut -f 2- cols.txt | nl | sed 's/^ *//'
1       0       chr1    3000575 3000801 0       chr1    4340023 4340249 32      32
2       0       chr1    3000641 3000801 -1      chr1    3311943 3311783 32      32
3       0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32
4       0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32
5       0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32

このcutユーティリティは、入力から「切り取る」列のリストを受け取ります。この場合、列 2 以降 ( -f 2-) です。データはタブ区切りなので、cutはこれを変更せずに実行しますが、それ以外の場合は で別の区切り文字を使用するように指示できます-d

このsedコマンドは、行の先頭のスペースを単にnl何もないものに置き換えます。

答え2

awk

$ awk '{$1=FNR-1; print}' OFS='\t' file
0   0   chr1    3000575 3000801 0   chr1    4340023 4340249 32  32
1   0   chr1    3000641 3000801 -1  chr1    3311943 3311783 32  32
2   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32
3   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32
4   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32

答え3

(置換ではリテラルedタブをCtrl-V+として使用)TAB

$ ed -s file << EOF
,s/0    //
,n
q
EOF

1   0   chr1    3000575 3000801 0   chr1    4340023 4340249 32  32  
2   0   chr1    3000641 3000801 -1  chr1    3311943 3311783 32  32  
3   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
4   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
5   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32

この(.,.)nコマンドは、アドレス指定された行を出力します。各行の前に行番号とタブが付きます。タブ区切り形式に最適です。

関連情報