2番目の列の内容を2つの列に分割する必要がありますfile
。たとえば、次のようになります。
Id allele id2
30 TC 12
211 GG 12
327 AA 13
688 TC 15
760 TT 18
868 CC 90
出力は次のようになります。
Id allele1 allele2 id2
30 T C 12
211 G G 12
327 A A 13
688 T C 15
760 T T 18
868 C C 90
答え1
そしてawk
:
awk 'NR==1{$2=$2"1 "$2"2"} NR!=1{split($2,a,""); $2=a[1]" "a[2];}1' file
NR==1
最初の行にのみ適用$2=...
:2番目のフィールドをタイトルに再フォーマットします。allele1 allele2
NR!=1
他のすべての行に適用されます。split($2,a,"")
$2
配列の2番目のフィールドの分割a
$2=a[1]" "a[2];
:2つの分割値を使用しa[1]
、2番目のフィールドの形式を再指定しますa[2]
。
1
最後の条件がtrueで、awk
行全体(アクション)が印刷されます。
列にリストするには、これを使用しますawk ... | column -t
。出力は次のとおりです。
Id allele1 allele2 id2
30 T C 12
211 G G 12
327 A A 13
688 T C 15
760 T T 18
868 C C 90
答え2
ここに別のものがありますsed
:
sed '1!s/ *./&\t/;t
s/a.*e/&1 &2/
' <infile >outfile
実際の使用が必要な場合があります。<タブ>\t
ここで使用されているエスケープ文字の代わりに文字を使用してください。
この方法は、列がスペースで区切られた場合に機能します。もし彼らが実際に<タブ>文字は列を分割するため、少し変更する必要があります。
sed '1!s/\t./&\t/;t
s/a.*e/&1 &2/
' <infile >outfile
...テキストが必要な場合があるという前の注意と同じ<タブ>バックスラッシュエスケープを置き換えます\
。
Id allele1 allele2 id
30 T C 12
211 G G 12
327 A A 13
688 T C 15
760 T T 18
868 C C 90
答え3
$ cat file|sed -e 's,\([^ ]*\)[ ]*\(.\)\(.\),\1 \2 \3,' -e '1 s/a llele/allele1 allele2/'
Id allele1 allele2 id2
30 T C 12
211 G G 12
327 A A 13
688 T C 15
760 T T 18
868 C C 90
答え4
パールの使用:
perl -lane '$,=" ";@F[1]=~s/./$& /;print(@F)' in
cat in
30 TC 12
211 GG 12
327 AA 13
688 TC 15
760 TT 18
868 CC 90
% perl -lane '$,=" ";@F[1]=~s/./$& /;print(@F)' in
30 T C 12
211 G G 12
327 A A 13
688 T C 15
760 T T 18
868 C C 90