문자를 반복하여 열의 항목을 고유 문자 수만큼 열로 분할합니다.

문자를 반복하여 열의 항목을 고유 문자 수만큼 열로 분할합니다.

그래서 다음과 같은 파일이 있습니다.

  • file1: 세 개의 열

    SNP Id Geno
    1 a AB
    2 a AB
    3 a BB
    . . .
    . . .
    . . .
    1 b AB
    2 b BB
    3 b AB
    . . .
    . . .
    . . .
    1 c AA
    2 c AB
    3 c AA
    . . .
    . . .
    . . .
    

다음과 같은 파일이 필요합니다.

  • file2: 유전자형이 있는 ID의 개수만큼

    SNP Genoa Genob Genoc . . .
    1 AB AB AA
    2 AB BB AB
    3 BB AB AA
    . . . .
    . . . .
    . . . .
    

답변1

이 스크립트는 간결하지도 읽기 쉽지도 않지만 작동하며 이미 게시된 솔루션과 달리 awk헤더 행도 생성합니다.

sed 'G;s/^SNP.*/SNP/
/^1 /s/ \([^ ]*\) .*SNP[^[:cntrl:]]*/& Geno\1/
s/^\([0-9]*\) [^ ]*\( [AB]*\)\n\(.*\n\1 [AB ]*\)/\3\2/
s/^\([0-9]*\) [^ ]*\( [AB]*\)\(\n\)\(.*\)/\4\3\1\2/
h
$!d' file1 > file2

사용자가 아닌 경우 다음과 같이 주어진 솔루션을 확장하여 헤더 행을 생성 awk할 수도 있습니다 .awk

awk '{if ($1==1) h=h" Geno"$2
if ($1!="SNP") g[$1]=g[$1]" "$3}
END {print "SNP"h; for (i in g) print i g[i]}' file1 > file2

답변2

awk '{g[$1] = g[$1] " " $3}
     END {for (i in g) print i g[i]}' < file1 > file2

또는 순서를 유지하십시오.

awk '! ($1 in g) {snp[n++] = $1}
     {g[$1] = g[$1] " " $3}
     END {for (i = 0; i < n; i++) print snp[i] g[snp[i]]}' < file1 > file2

"SNP Genoa Genob..." 헤더를 포함하려면:

awk 'NR == 1 {header = $1; prefix = $3; next}
     first == "" {first = "" $1}
     $1 == first {header = header " " prefix $2}
     ! ($1 in g) {snp[n++] = $1}
     {g[$1] = g[$1] " " $3}
     END {
       print header
       for (i = 0; i < n; i++) print snp[i] g[snp[i]]
     }' < file1 > file2

답변3

perl -lane '
   next if $. == 1;                                     # skip header
   $A[@A] = $F[1] if /^1\h/;                            # populate new header
   push @{$h{$F[0]}}, $F[2]}{$,="\t";                   # OFS = tab
   print q/SNP/, map { "Geno$_" } @A;                   # new header print
   print $_, @{$h{$_}} for sort { $a <=> $b } keys %h;  # result
' gene.data

여기서 세 번째 필드는 $F[2]AoA(array_of_array)에 저장됩니다. 마지막으로 해시 키를 숫자순으로 정렬하고 데이터를 인쇄합니다.

sed -e '
   1d; # monospace lines
   s/[[:blank:]]\{1,\}/\t/g;s/^[[:blank:]]*//;s/[[:blank:]]*$//
   H;g
   #  1   2                            3                     4
   s/\(\n\(.*\n\)\{0,1\}\)1[[:blank:]]\([^[:space:]]\{1,\}\)\([[:blank:]][^[:space:]]\{1,\}\)$/\tGeno\3\1\n1\4/
   /\(\n[^[:space:]]\{1,\}[[:blank:]]\)[^[:space:]]\{1,\}[[:blank:]]\([^[:space:]]\{1,\}\)$/s//\1\2/
   y/\n_/_\n/
   s/_\([0-9]\{1,\}\)\([^_]*\)_\(.*_\)\{0,1\}\1\([[:blank:]][^_]*\)/_\1\2\4_\3/
   y/\n_/_\n/
   h;$!d
   s/\n*$//
   s/\n\(\n\)/\1/
   s/^[[:blank:]]/SNP&/
' gene.data

결과

SNP     Genoa   Genob   Genoc
1       AB      AB      AA
2       AB      BB      AB
3       BB      AB      AA

관련 정보