file.bim
次の約150万行のファイル()があります。
1 1:819959:C:T 0 819959 T C
1 1:821249:G:A 0 821249 A G
1 1:821477:A:G 0 821477 G A
1 1:821843:C:T 0 821843 T C
1 1:823963:A:C 0 823963 C A
1 1:824357:C:T 0 824357 T C
1 1:824398:A:C 0 824398 C A
1 1:827972:G:A 0 827972 A G
1 1:828539:A:T 0 828539 T A
2番目の列から2番目のコロンと次の3文字を削除し、残りの列をそのまま残したいと思います。希望の出力は次のとおりですupdated_file.bim
。
1 1:819959 0 819959 T C
1 1:821249 0 821249 A G
1 1:821477 0 821477 G A
1 1:821843 0 821843 T C
1 1:823963 0 823963 C A
1 1:824357 0 824357 T C
1 1:824398 0 824398 C A
1 1:827972 0 827972 A G
1 1:828539 0 828539 T A
を使ってみましたが、awk
ここではコロンだけが削除されましたが、その間の文字はそのまま残ります。
awk -F":" '{ print $1":"$2,$3,$4,$5,$6 }' file.bim > updated_file.bim
答え1
次のプログラムを使用できますawk
。
awk '{sub(/:[^:]*:[^:]*$/,"",$2)}1' file.bim > updated_file.bim
または
awk '{sub(/(:[^:]*){2}$/,"",$2)}1' file.bim > updated_file.bim
この関数を使用して2番目の列()をsub()
編集し、最後の2つの列とその後のテキストを「なし」に置き換えて、そのセクションを効果的に削除します。$2
:
出力ファイルをタブで区切る必要がある場合awk -v OFS="\t" ' ... '
。
または、ファイルが次のように区切られた場合複数の「空間」で構成されるグループ区切り文字の形式が完全に変更されていないことを確認するには、次のようにします。
awk '{sub(/:[^:]*:[^: ]* /," ")}1' file.bim > updated_file.bim
:
「、テキスト、、テキスト、:
スペース」パターンを見つけて、そのパターンを単一の「スペース」に置き換えます。入力では、このパターンは列2の終わりにのみ発生するため、置換はその列にのみ影響します。
ついに、後でいつでも:
2番目の列の - で区切られたフィールドの数が変更される可能性がありますが、まだ最初の2つだけを維持したい場合オリジナル2番目の列を最初の列の周りのテキストにのみ置き換える移植性が劣る変形ですが:
(最後の2列の後に「なし」があるテキストの代わりに):
awk '{$2=gensub(/([^:]+:[^:]+).*/,"\\1","1",$2)}1' file.bim > updated_file.bim
答え2
2番目の列の2番目のコロンの後のすべての内容を削除し、残りはすべて保持します。
awk '{ c=split($2, s, ":"); $2=s[1] (c>1?":":"") s[2]; }1' infile
ご存知のように、これが大きな問題ではない場合は、2番目の列を再評価すると重複するスペースが削除されます。それ以外の場合は、次のものを代わりsed
に使用します。
sed -E 's/^([^ ]* *)([^: ]*:[^: ]*):[^ ]* (.*)/\1\2 \3/' infile
試験日;
::1 1:81995:9:C:T 0 8::199:59 T C
1:a: :1821249GA: 0 821:2:4 A G
111 1:828539:: 0 :::828539 T A
結果:
::1 1:81995 0 8::199:59 T C
1:a: :1821249GA 0 821:2:4 A G
111 1:828539 0 :::828539 T A
答え3
GNU sedを使用すると、次のことができます\S
。
$ sed 's/\(:[^:]*\)\S*/\1/' file
1 1:819959 0 819959 T C
1 1:821249 0 821249 A G
1 1:821477 0 821477 G A
1 1:821843 0 821843 T C
1 1:823963 0 823963 C A
1 1:824357 0 824357 T C
1 1:824398 0 824398 C A
1 1:827972 0 827972 A G
1 1:828539 0 828539 T A
または、POSIX sedを使用してください。
$ sed 's/\(:[^:]*\)[^[:space:]]*/\1/' file
1 1:819959 0 819959 T C
1 1:821249 0 821249 A G
1 1:821477 0 821477 G A
1 1:821843 0 821843 T C
1 1:823963 0 823963 C A
1 1:824357 0 824357 T C
1 1:824398 0 824398 C A
1 1:827972 0 827972 A G
1 1:828539 0 828539 T A
答え4
まず、2ドルからお好みのものをawk
選択してください。代わりにsubstr($2, 1, 8)
値を印刷してください。したがって、あなたのコードは次のようになります。s
$2
awk 's = substr($2, 1, 8) {print $1, s, $3, $4, $5, $6}' file
1 1:819959 0 819959 T C
1 1:821249 0 821249 A G
1 1:821477 0 821477 G A
1 1:821843 0 821843 T C
1 1:823963 0 823963 C A
1 1:824357 0 824357 T C
1 1:824398 0 824398 C A
1 1:827972 0 827972 A G
1 1:828539 0 828539 T A
スペースを保存するために更新されました。
awk -F '[[:blank:]]{2,}' '$2 = substr($2, 1, 8) {print $1, $2, $3, $4, $5, $6}' file | column -t
1 1:819959 0 819959 T C
1 1:821249 0 821249 A G
1 1:821477 0 821477 G A
1 1:821843 0 821843 T C
1 1:823963 0 823963 C A
1 1:824357 0 824357 T C
1 1:824398 0 824398 C A
1 1:827972 0 827972 A G
1 1:828539 0 828539 T A