특정 파일에 대해 AWK를 사용하여 특정 패턴이 포함된 열을 인쇄합니다.

특정 파일에 대해 AWK를 사용하여 특정 패턴이 포함된 열을 인쇄합니다.

200개 이상의 열(몇 개만 표시됨)이 포함된 입력 파일(탭으로 구분)이 있습니다.

col1     col2        col3          col4               col5 
ID       GPD1431     GPD1632       GPD1253            GPD2353
Group    GDS_Treated GDS_Untreated GDS_paired_Treated GDS_paired_Untreated 
Measure1 7.6         8.2           9.3                4.2
Measure2 0.32        0.56          0.343              0.423

내가 원하는 것은 처리되지 않은 샘플이나 첫 번째 열을 설명하는 그룹의 열만 가져오도록 이 데이터 파일의 부분 집합을 만드는 것입니다. 출력 파일도 탭으로 구분된 파일이기를 원합니다. 이와 같이:

col1     col3          col5 
ID       GPD1632       GPD2353
Group    GDS_Untreated GDS_paired_Untreated 
Measure1 8.2           4.2
Measure2 0.56          0.423

내가 지금까지 가지고 있는 것은 이것입니다:

awk -F '\t' '{for(i=1; i<=NF; i++) {if($i ~ /Untreated|untreated/ || i==1) col_array[i]=i}} END {for (val in col_array) {print col_array[val]}}' file > columns_to_print.txt

이 출력의 결과는 다음과 같습니다.

1
3
7
9
12
43
...
203

col_array의 내용을 인쇄하면 빠른 육안 검사를 통해 숫자가 올바른 열 번호와 일치하는 것으로 보입니다. 그래서 이것은 좋은 시작인 것 같습니다. 하지만 이 정보를 사용하여 탭으로 구분된 파일에서 원하는 열을 인쇄하는 방법이 혼란스럽습니다.

시도해 보았지만 awk 'NR==FNR{columns[$1]=$1;next}{for(i=1; i<=NF; i++){if(columns[i]>1)print $i}}' columns_to_print.txt file올바른 열이 인쇄되지 않는 것 같습니다. (그리고 모든 것이 한 열에 있도록 인쇄물의 형식이 지정되었습니다.)

당신의 도움을 주셔서 감사합니다.

답변1

awk이 작업에 대한 스크립트 는 다음과 같습니다 .

awk -F '\t' 'BEGIN {cols[1]}
    pass == 1 && $1 == "Group" {
        for (i=2;i<=NF;i++) if ($i ~ /[Uu]ntreated$/) cols[i]
        nextfile
    }
    pass == 2 {
        rec = ""
        for (i=1;i<=NF;i++) {
            if (i in cols) rec = (rec ? rec FS $i : $i)
        }
        print rec
    }' pass=1 file pass=2 file

먼저 "Group"으로 시작하는 행을 검색하고 해당 행에 대해 패턴과 일치하는 필드의 열 번호를 저장합니다. 첫 번째 구문 분석을 즉시 종료합니다.nextfile.

두 번째 패스에서는 에 저장된 열만 인쇄합니다 cols. 모든 필드를 반복하고 변수에 인쇄될 행을 구성합니다 rec. 역시 표준이다조건식여기서 사용되고 있습니다.

테스트 출력:

col1      col3           col5
ID        GPD1632        GPD2353
Group     GDS_Untreated  GDS_paired_Untreated
Measure1  8.2            4.2
Measure2  0.56           0.423

관련 정보