2番目のコロンの後の列からすべての内容を削除する方法

2番目のコロンの後の列からすべての内容を削除する方法

次の約700万行のファイルがあります。

head gokind_SNPs.txt
1:753541:G:A
1:769223:C:G
1:771967:G:A
1:778745:A:G
1:779322:A:G
...

2番目のコロンの後のすべての項目をどのように削除して、次のように見えますか?

1:753541
1:769223
1:771967
1:778745
1:779322
...

これを試しましたが、うまくいかず、ファイルが変更されませんでした。

sed 's/:[A-Z].* / /g' gokind_SNPsF.txt > gokind_SNPsf.txt

答え1

awkに含まれる文字を削除するには、awkを使用してください。

awk -F":" '{ print $1":"$2 }' gokind_SNPs.txt > gokind_SNPs_OUTPUT.txt

答え2

使用中の正規表現がデータに存在しないスペースを一致させようとするため、コマンドは何もしません。

代わりに

sed 's/:[A-Z].*//' gokind_SNPsF.txt >new-gokind_SNPsf.txt

:これにより、大文字の直後の各行の最初の行にあるすべてのテキストが削除されます。また、スペースを変更する代わりに何も変更しないことを選択し、g不要なフラグを削除しました。

私はあなたが持っていないと仮定します実際に表示されたコマンドを実行すると、開始前にデータファイルが切り捨てられます(空になります)sed(読み込んでいるのと同じファイルにリダイレクトされるため)。

sed内部編集に使用するにはsed -i、」をお読みください。sed -i(所定の位置で編集)を使用して移植性を達成するには?」。

あなたのコマンドよりも速い選択肢は次sedのとおりです。

cut -d: -f -2 gokind_SNPsF.txt >new-gokind_SNPsf.txt

:各行から最初の2つの区切りフィールドのみを抽出します。またはを-f -2使用して、最初の2つの列を取得するように指定できます。-f 1,2-f 1-2

を使用するawkとします

awk -F : 'BEGIN { OFS=FS } { print $1, $2 }' gokind_SNPsF.txt >new-gokind_SNPsf.txt

各行の最初の2つのフィールドのみが新しいファイルに印刷されます。

GNUを使用すると、awk次のコマンドを使用して任意の場所で編集できます。

awk -i inplace -F : 'BEGIN { OFS=FS } { print $1, $2 }' gokind_SNPsF.txt

望むより」awkを使ってファイルを変更する方法は? ("sed -i"と同じ)「これについて詳しく学んでください。

答え3

このcutコマンドはまさに以下のために設計されています。

cut -d: -f-2

答え4

読んでいるファイルに絶対に書き込まないでください。

sed 's/:[A-Z].* / /' gokind_SNPsF.txt > tmp && mv tmp gokind_SNPsf.txt

sed -iまたは、使用しているsedバージョンでサポートされている場合は使用してください。

関連情報