特定の列の内容の分割

特定の列の内容の分割

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

関連情報