awk를 사용하여 일치하는 데이터를 선택하고 추출하는 방법은 무엇입니까?

awk를 사용하여 일치하는 데이터를 선택하고 추출하는 방법은 무엇입니까?

내 파일 1에는 유전자 목록만 포함되어 있고 파일 2에는 더 긴 유전자 목록과 유전자 통계가 포함되어 있습니다. 파일 1의 유전자와 일치하는 통계를 찾아 새 파일 3에 넣으려고 합니다. 특정 File 2의 33개 열 중 내가 원하는 유일한 통계는 열 29에 있지만 여전히 이 항목에 갇혀 있기 때문에 현재 File 1 유전자의 각 열에 대한 정보를 찾는 코드를 작성하고 있습니다.

예를 들어 내 데이터는 다음과 같습니다.

파일 1:

Gene
ACE
BRCA
HER.2
NOS
P53
PTGIS

파일 2:

gene_id   Gene    pval    beta    maf    ...     qval   ...
12345     ACE     0.01    300     100            0.0008
67890     UMOD.1  0.002   400     45             0.047
00008     HER.2   0.02    123     98             0.56
34587     CICP3   0.05    55      12             0.77
67859     HER     0.003   600     33             0.234

제가 원하는 것은 29열입니다 . 29열 전후에 더 많은 열이 있다는 것을 암시했지만 저는 stackexchange에 대한 경험이 없습니다. 더 나은 예를 위해 더 큰 데이터로 완성할 수 있는 방법이 있다면 알려주세요 qval. ...즉시 할게요.

이러한 예제 데이터 세트를 사용하면 출력 파일 3은 다음과 같습니다.

Gene   qval
ACE    0.0008
HER.2  0.56

나는 일치하는 두 유전자에 대한 모든 열을 제공할 것이라고 생각한 코드를 시도했지만 현재는 빈 출력 파일을 제공합니다.

awk 'BEGIN{FS=OFS="\t"} {sub(/\.[0-9]+$/,"",$2)} FNR==NR{$30="";sub(/[[:space:]]+$/,"");a[$2]=$0;next} $1 in a{print a[$2],$NF}' file2.txt   file1.txt > file3.txt

또한 다른 접근 방식을 시도했는데, 더 구체적으로 29열을 가져오는데, 이는 실행되지만 출력 일치는 일부 일치하는 유전자 데이터만 제공하고 일치하는 데이터가 있어야 하는 다른 것들은 "NA"로 유지됩니다.

awk '{printf("%s\t%s\n", $2, $29)}' originalfile2.txt > file2.txt

awk '{
    split($1,k,".")         
}
NR==FNR {
    a[k[1]]=$1              
    next
}
k[1] in a {                 
    print $0 "\t" a[k[1]]   
}'  file1.txt file2.txt  > file3.txt

awk '{$3=""; print $0}' file3.txt | column -t > file3.txt 
sed -e '1i\Gene \ qval' file3.txt | column -t > file3.txt

답변1

당신의 유전자 이름 목록은 DOS 텍스트 파일이군요, 그렇죠? 이는 각 유전자 이름 끝에 추가 캐리지 리턴이 있음을 의미합니다. 이는 파일 간에 이름이 일치하지 않음을 의미합니다. 이는 출력이 비어 있음을 의미합니다.

.dll을 사용하여 유전자 목록을 Unix 텍스트 파일로 변환합니다 dos2unix. 그런 다음 코드를 사용하십시오무루님이 댓글을 남겨주셨네요(두 번째 파일이 탭으로 구분되어 있다고 가정):

awk -v OFS='\t' 'FNR == NR {a[$0]++; next}; $2 in a {print $2, $29}' file1 file2 >file3

또는 awk각 줄 끝에서 캐리지 리턴을 제거합니다.

awk -v OFS='\t' '{ sub("\r$", "") } FNR == NR {a[$0]++; next}; $2 in a {print $2, $29}' file1 file2 >file3

관련 정보