내 파일 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