テキストファイルの列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

With(置換時に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コマンドは、各行の前に行番号とタブ文字を追加して、指定された行を印刷します。これはタブ区切り形式に最適です。

関連情報