특정 열의 내용 분할

특정 열의 내용 분할

두 번째 열의 내용을 두 개의 열로 분할해야 합니다 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마지막 조건이 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

관련 정보