拆分特定列的内容

拆分特定列的内容

我需要将 my 第二列的内容分成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=...:将第二个字段重新格式化为标题allele1 allele2
  • NR!=1适用于所有其他线路。
    • split($2,a,"")$2分割数组中的第二个字段a
    • $2=a[1]" "a[2];:使用两个分割值a[1]和重新格式化第二个字段a[2]
  • 1最后的条件为真,打印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:

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

相关内容