我需要将 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