약 1000개의 열이 포함된 큰 파일이 있습니다. 처음 두 열은 염색체 및 SNP(단일 염기 다형성) 위치이고 나머지는 샘플입니다. 처음 몇 줄은 다음과 같습니다.
#CHROM POS P0431 P432 P433 P434 P435
Chr01 180349 G G G N G
Chr01 180372 N N N N A
Chr01 180389 A N A N N
이 데이터세트에는 서로 다른 3개 그룹의 샘플이 있는데, 이를 분리하여 별도의 파일에 저장하고 싶습니다.
이것은 충분한 group1 ID가 있는 파일입니다.
$ head group1
P0431
P434
P435
따라서 마스터 데이터에서 이러한 샘플을 찾아 group1.data로 저장하고 싶습니다.
$ head group1.data
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
답변1
입력 구분 기호로 공백(여러 개)을 가정하고 csvcut
and csvformat
from 을 사용합니다 .csvkit
$ csvcut -d' ' -S -c "#CHROM,POS,$(paste -sd, < group1)" group1.data | csvformat -T
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
답변2
$ cat tst.awk
NR==FNR {
groups[++numGroups] = $1
next
}
FNR==1 {
for (i=1; i<=NF; i++) {
f[$i] = i
}
}
{
printf "%s%s%s%s", $1, OFS, $2, OFS
for (groupNr=1; groupNr<=numGroups; groupNr++) {
group = groups[groupNr]
printf "%s%s", $(f[group]), (groupNr<numGroups ? OFS : ORS)
}
}
$ awk -f tst.awk group1 file
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
출력을 공백 구분 대신 탭 구분으로 지정하려면 스크립트 상단에 이라는 줄을 추가하세요 BEGIN { OFS="\t" }
.
출력을 시각적으로 표 형식으로 표시하려면 printf
awk에서 s를 사용하거나 위의 내용을 다음과 같이 파이프 할 수 있습니다 column
.
$ awk -f tst.awk group1 file | column -t
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
답변3
당신은 이것을 할 수 있습니다 awk
:
awk 'NR==1,NR==4 {print $1,$2,$3,$6,$7}' group1 > group1.data
그러면 필드 1, 2, 3, 6, 7의 처음 네 줄만 인쇄되고 요청한 출력이 제공되어 파일에 추가됩니다 group1.data
.
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
더 깔끔하게 보이도록 하려면 OFS='\t'
다음을 사용하여 구분 기호를 탭으로 설정할 수 있습니다.
awk 'NR==1,NR==4 {print $1,$2,$3,$4,$5}' OFS='\t' group1 > group1.data
산출:
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
저는 여러 개의 공백 구분 기호, 탭 및 둘의 조합을 사용하여 테스트했으며 매번 이러한 출력을 받았습니다.