필드를 기준으로 파일 비교 및 ​​추가

필드를 기준으로 파일 비교 및 ​​추가

2개의 파일을 비교하고 싶은데 locus_file.txt는 매우 큰 파일이고 atrr.txt는 작은 파일입니다. 첫 번째 파일의 처음 2개 열을 atrr.txt의 두 번째 열과 일치시키고 속성을 함께 인쇄하고 싶습니다.

locus_file.txt:대용량 파일

LOC_Os02g47020, LOC_Os03g57840,0.88725114
LOC_Os02g47020, LOC_Os07g36080,0.94455624
LOC_Os02g47020, LOC_Os03g02590,0.81881344

attr.txt: 속성 파일

blue LOC_Os02g47020
red  LOC_Os02g40830
blue LOC_Os07g36080
yellow LOC_Os03g57840
red LOC_Os03g02590

원하는 출력:

LOC_Os02g47020, LOC_Os03g57840,0.88725114,blue, yellow
LOC_Os02g47020, LOC_Os07g36080,0.94455624,blue, blue
LOC_Os02g47020, LOC_Os03g02590,0.81881344,blue, red

예를 들어 원하는 출력의 첫 번째 줄에서 4번째 열은 atrr.txt의 LOC_Os02g47020 색상을 가지며 5번째 열은 atrr.txt의 LOC_Os03g57840 색상을 갖습니다.

답변1

해결책 awk:

$ awk '
FNR == NR {a[$2] = $1;next}
{
    split($1,f1,",");
    split($2,f2,",");
    print $0,a[f1[1]],a[f2[1]];
}' OFS=, attr.txt locus_file.txt
LOC_Os02g47020, LOC_Os03g57840,0.88725114,blue,yellow
LOC_Os02g47020, LOC_Os07g36080,0.94455624,blue,blue
LOC_Os02g47020, LOC_Os03g02590,0.81881344,blue,red

답변2

이 작업은 awk의 작업 냄새가 납니다.

$ cat locus_file.txt 
LOC_Os02g47020, LOC_Os03g57840,0.88725114
LOC_Os02g47020, LOC_Os07g36080,0.94455624
LOC_Os02g47020, LOC_Os03g02590,0.81881344
$ cat attr.txt 
blue LOC_Os02g47020
red  LOC_Os02g40830
blue LOC_Os07g36080
yellow LOC_Os03g57840
red LOC_Os03g02590
$ awk 'BEGIN { while(getline<"attr.txt">0) c[$2]=$1 ; FS=",[ ]*" ; OFS=", " } { print $1,$2,$3,c[$1],c[$2] }' locus_file.txt 
LOC_Os02g47020, LOC_Os03g57840, 0.88725114, blue, yellow
LOC_Os02g47020, LOC_Os07g36080, 0.94455624, blue, blue
LOC_Os02g47020, LOC_Os03g02590, 0.81881344, blue, red

"," 대신 ","를 원하거나 다른 것을 원하면 다음과 같이 변경하세요 OFS.

$ awk 'BEGIN { while(getline<"attr.txt">0) c[$2]=$1 ; FS=",[ ]*" ; OFS="," } { print $1,$2,$3,c[$1],c[$2] }' locus_file.txt 
LOC_Os02g47020,LOC_Os03g57840,0.88725114,blue,yellow
LOC_Os02g47020,LOC_Os07g36080,0.94455624,blue,blue
LOC_Os02g47020,LOC_Os03g02590,0.81881344,blue,red

답변3

같은 건 어때?

declare -A attr

while read x y; do attr[$y]="$x"; done < attr.txt

그 다음에

while IFS=' ,' read a b c; do 
  d=${attr[$a]}
  e=${attr[$b]} 
  printf "%s, %s,%s,%s, %s\n" "$a" "$b" "$c" "$d" "$e"
done < locus_file.txt

관련 정보