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