그래서 다음과 같은 파일이 있습니다.
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