形式を変更せずにファイルから列を削除する方法は?

形式を変更せずにファイルから列を削除する方法は?

次のように、ファイルから最初の列を削除する必要があります。

165 1   chr22   42090593    0   1   chr22   42090609    1   42  42
166 1   chr22   42090593    0   1   chr22   42090654    1   42  42
167 1   chr22   42090595    0   1   chr22   42090633    1   42  42
168 0   chr22   42090612    0   1   chr22   42090656    1   42  42
169 0   chr22   42090614    0   0   chr22   42090617    1   40  42
170 0   chr22   42090647    0   1   chr22   42090749    1   42  42
171 1   chr22   42090684    0   1   chr22   42090692    1   42  42
172 1   chr22   42090733    0   1   chr22   42090743    1   42  42
173 1   chr22   42090733    0   1   chr22   42090775    1   42  42
174 1   chr22   42090733    0   1   chr22   42090789    1   42  42
175 1   chr22   42090757    0   1   chr22   42090787    1   42  24
176 0   chr22   42090778    0   0   chr22   42090790    1   42  42
177 0   chr22   42090800    0   0   chr22   42090802    1   42  42
178 0   chr22   42090803    0   0   chr22   42090806    1   42  42

注文する

awk '{$1=""; print $0}'

最初の列を正しく削除しますが、この方法で型を変更します。

1 chr22 51178322 0 0 chr22 51178659 1 42 42
0 chr22 51178661 0 0 chr22 51178663 1 42 42
0 chr22 51178667 0 1 chr22 51178790 1 42 23
1 chr22 51178755 0 0 chr22 51178764 1 42 42
0 chr22 51178808 0 1 chr22 51178871 1 42 42
1 chr22 51178869 0 1 chr22 51178895 1 42 42
1 chr22 51178881 0 1 chr22 51178893 1 42 42
1 chr22 51178881 0 1 chr22 51178895 1 42 42
1 chr22 51179213 0 1 chr22 51179213 1 42 42
1 chr22 51180087 0 1 chr22 51180093 1 42 42
1 chr22 51180134 0 0 chr22 51181889 1 42 42
0 chr22 51186192 0 0 chr22 51186192 1 42 42
0 chr22 51186192 0 0 chr22 51186192 1 42 42

どんなアイデアがありますか?

答え1

あなたのアプローチには2つの問題があります。まず、これはタブ区切りファイルのように見え、awkにタブを使用するように指示しませんでした。次に、awkでフィールドを設定するときに""フィールドを削除するのではなく、消去するだけです。したがって、それでも印刷されるので、出力の各行の先頭に余分なスペースがあります。

したがって、awkでこれを行うには、次のことが必要です(例の先行スペースは実際にはファイルの一部ではないと仮定します)。

$ awk -F"\t" 'BEGIN{OFS="\t"}{for(i=2;i<NF;i++){printf "%s%s",$i,OFS} print $NF}' file 
1   chr22   42090593    0   1   chr22   42090609    1   42  42
1   chr22   42090593    0   1   chr22   42090654    1   42  42
1   chr22   42090595    0   1   chr22   42090633    1   42  42
0   chr22   42090612    0   1   chr22   42090656    1   42  42
0   chr22   42090614    0   0   chr22   42090617    1   40  42
0   chr22   42090647    0   1   chr22   42090749    1   42  42
1   chr22   42090684    0   1   chr22   42090692    1   42  42
1   chr22   42090733    0   1   chr22   42090743    1   42  42
1   chr22   42090733    0   1   chr22   42090775    1   42  42
1   chr22   42090733    0   1   chr22   42090789    1   42  42
1   chr22   42090757    0   1   chr22   42090787    1   42  24
0   chr22   42090778    0   0   chr22   42090790    1   42  42
0   chr22   42090800    0   0   chr22   42090802    1   42  42
0   chr22   42090803    0   0   chr22   42090806    1   42  42

しかし、次のような他のツールはcut すでに言及ここはもっと簡単です。ファイルがタブで区切られている場合は、次のことができます。

$ cut -f2- file 
1   chr22   42090593    0   1   chr22   42090609    1   42  42
1   chr22   42090593    0   1   chr22   42090654    1   42  42
1   chr22   42090595    0   1   chr22   42090633    1   42  42
0   chr22   42090612    0   1   chr22   42090656    1   42  42
0   chr22   42090614    0   0   chr22   42090617    1   40  42
0   chr22   42090647    0   1   chr22   42090749    1   42  42
1   chr22   42090684    0   1   chr22   42090692    1   42  42
1   chr22   42090733    0   1   chr22   42090743    1   42  42
1   chr22   42090733    0   1   chr22   42090775    1   42  42
1   chr22   42090733    0   1   chr22   42090789    1   42  42
1   chr22   42090757    0   1   chr22   42090787    1   42  24
0   chr22   42090778    0   0   chr22   42090790    1   42  42
0   chr22   42090800    0   0   chr22   42090802    1   42  42
0   chr22   42090803    0   0   chr22   42090806    1   42  42

他の選択肢:

$ grep -oP '^\s*\S+\s*\K.*' file 
1   chr22   42090593    0   1   chr22   42090609    1   42  42
1   chr22   42090593    0   1   chr22   42090654    1   42  42
1   chr22   42090595    0   1   chr22   42090633    1   42  42
0   chr22   42090612    0   1   chr22   42090656    1   42  42
0   chr22   42090614    0   0   chr22   42090617    1   40  42
0   chr22   42090647    0   1   chr22   42090749    1   42  42
1   chr22   42090684    0   1   chr22   42090692    1   42  42
1   chr22   42090733    0   1   chr22   42090743    1   42  42
1   chr22   42090733    0   1   chr22   42090775    1   42  42
1   chr22   42090733    0   1   chr22   42090789    1   42  42
1   chr22   42090757    0   1   chr22   42090787    1   42  24
0   chr22   42090778    0   0   chr22   42090790    1   42  42
0   chr22   42090800    0   0   chr22   42090802    1   42  42
0   chr22   42090803    0   0   chr22   42090806    1   42  42

または

$ perl -pe 's/^\s*\S+\s*//' file 
1   chr22   42090593    0   1   chr22   42090609    1   42  42
1   chr22   42090593    0   1   chr22   42090654    1   42  42
1   chr22   42090595    0   1   chr22   42090633    1   42  42
0   chr22   42090612    0   1   chr22   42090656    1   42  42
0   chr22   42090614    0   0   chr22   42090617    1   40  42
0   chr22   42090647    0   1   chr22   42090749    1   42  42
1   chr22   42090684    0   1   chr22   42090692    1   42  42
1   chr22   42090733    0   1   chr22   42090743    1   42  42
1   chr22   42090733    0   1   chr22   42090775    1   42  42
1   chr22   42090733    0   1   chr22   42090789    1   42  42
1   chr22   42090757    0   1   chr22   42090787    1   42  24
0   chr22   42090778    0   0   chr22   42090790    1   42  42
0   chr22   42090800    0   0   chr22   42090802    1   42  42
0   chr22   42090803    0   0   chr22   42090806    1   42  42

または

$ perl -F'\t' -lane 'print join "\t",@F[1..$#F]' file 
1   chr22   42090593    0   1   chr22   42090609    1   42  42
1   chr22   42090593    0   1   chr22   42090654    1   42  42
1   chr22   42090595    0   1   chr22   42090633    1   42  42
0   chr22   42090612    0   1   chr22   42090656    1   42  42
0   chr22   42090614    0   0   chr22   42090617    1   40  42
0   chr22   42090647    0   1   chr22   42090749    1   42  42
1   chr22   42090684    0   1   chr22   42090692    1   42  42
1   chr22   42090733    0   1   chr22   42090743    1   42  42
1   chr22   42090733    0   1   chr22   42090775    1   42  42
1   chr22   42090733    0   1   chr22   42090789    1   42  42
1   chr22   42090757    0   1   chr22   42090787    1   42  24
0   chr22   42090778    0   0   chr22   42090790    1   42  42
0   chr22   42090800    0   0   chr22   42090802    1   42  42
0   chr22   42090803    0   0   chr22   42090806    1   42  42

答え2

区切り文字にスペースがある場合は、次のように動作できます。

sed 's/^ *//' text.file | cut -f1 -d" " --complement

答え3

実際にいると仮定先行スペースなしファイルでは、次のsedベース方法が機能するはずです。

sed -r 's/^[[:digit:]]+[[:blank:]]+//' input_file

またはもっと一般的に(@terdonが提案したように)

sed -r 's/^[^[:blank:]]+[[:blank:]]+//' input_file

最初の例では、1 つ以上の数字を行の先頭から始まる「None」に置き換え、その後に 1 つ以上の空白文字を追加して、残りの部分を変更せずに行の対応する部分を削除します。

2番目の例では、「空白ではない」文字と1つ以上の空白文字を削除するため、最初の列にテキスト(ヘッダー行など)を含めることができる場合は、より一般的に適用できます。

先行スペースがある場合は、次のように修正します。

sed -r 's/^[[:blank:]]*[^[:blank:]]+[[:blank:]]+//' input_file

最初にゼロ個以上のスペースを含むパターンを削除できるため、この問題を解決する必要があります。

スペースとタブと一致するため、[[:blank:]]タブで区切られたファイル形式でも機能する必要があります。

一般的な注意事項として、使用中の形式の変更はawk通常、設定の失敗によって発生します。出力フィールド区切り記号 OFS適切な値で。awkルールの個々のフィールドを変更すると、$0現在の値がデフォルト値を使用して再生成され、元の行の形式が上書きされます。OFSSPACE

したがって、入力ファイルがTAB区切られている場合、フィールドを変更すると、出力が空白で区切られ、説明されている形式の変更が記述されます。適切な内部変数を設定することでこの問題を克服できます。

awk -v OFS='\t' '{あなたのコードはここにあります} '入力ファイル

これが起こらないようにするには、@terdonすでに言及、単にフィールドを空の文字列に設定しても、そのフィールドは削除されず、余分なフィールド区切り記号が必要になります。

答え4

gnu sedを使用してこれを行うことができます。

$ sed -Ee 's/\S+/\n&/2;s/.*\n//' file 

2番目のフィールドの先頭を表示し、その前のすべての項目を削除します。

上記と同じ方法ですが、awkを使用します。

awk '
  BEGIN {
    s = "[[:space:]]"; S = "[^[:space:]]" 
    F = S"+"s"*" 
  }
  sub(s"*" F, "")+1
' file

上記と同じですが、一致する機能があります

awk '
   BEGIN {
     s = "[[:space:]]"; S = "[^[:space:]]"
     F = S"+"s"*" 
   }
   match($0, F) {
     $0 = substr($0, RSTART+RLENGTH)
   }1
' file 

関連情報