Unix에서 열 이름으로 txt 파일의 열을 선택하는 방법

Unix에서 열 이름으로 txt 파일의 열을 선택하는 방법

약 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

입력 구분 기호로 공백(여러 개)을 가정하고 csvcutand csvformatfrom 을 사용합니다 .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" }.

출력을 시각적으로 표 형식으로 표시하려면 printfawk에서 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

저는 여러 개의 공백 구분 기호, 탭 및 둘의 조합을 사용하여 테스트했으며 매번 이러한 출력을 받았습니다.

관련 정보