두 파일을 비교하고 일치시켜 하나의 파일로 인쇄하고 싶습니다.

두 파일을 비교하고 일치시켜 하나의 파일로 인쇄하고 싶습니다.

file1과 file2라는 두 개의 파일이 있습니다.

파일 1:

r11_abc_gkhsa 1.0 1.5 1.9
r11_bcd_gkhsa 1.0 1.5 1.7
r11_acd_gkhsa 1.3 1.6 1.5
r11_xyz_gkhsa 1.0 1.5 1.9

파일 2:

sd1_bcd_gkhsa 1.8 1.5 1.9
ab1_abc_gkhsa 1.6 1.4 1.5
sfs_xyz_gkhsa 1.4 1.6 1.4
sd1_acd_gkhsa 1.2 1.3 1.5
sfs_ryb_gkhsa 1.5 1.2 1.7

file1의 "abc, bcd, acd 및 xyz"를 file2와 일치시키고 싶습니다. file2와 일치할 때마다 다음과 같이 인쇄하고 싶습니다.

산출:

r11_abc_gkhsa 1.0 1.5 1.9     ab1_abc_gkhsa 1.6 1.4 1.5
r11_bcd_gkhsa 1.0 1.5 1.7     sd1_bcd_gkhsa 1.8 1.5 1.9
r11_acd_gkhsa 1.3 1.6 1.5     sd1_acd_gkhsa 1.2 1.3 1.5
r11_xyz_gkhsa 1.0 1.5 1.9     sfs_xyz_gkhsa 1.4 1.6 1.4
sfs_ryb_gkhsa 1.5 1.2 1.7

Perl이나 sed를 사용할 수 있습니다. 누군가 나에게 이 문제를 해결할 수 있는 몇 가지 아이디어를 줄 수 있습니까?

답변1

일반 배열을 사용하려는 경우 bash-

#read in the data from 2 files
unset arr1; declare -A arr1; 
while read -r -u3 line; do \
    i=${line%_*}; \
    i=${i#*_}; \
    arr1[$i]+=" $line"; \
done 3< <(cat f1 f2); \
exec 3<&-
#output array by iterating throug the keys
for k in "${!arr1[@]}"; do \
     echo ${arr1[$k]}; \
done | sort

출력 -

r11_abc_gkhsa 1.0 1.5 1.9 ab1_abc_gkhsa 1.6 1.4 1.5
r11_acd_gkhsa 1.3 1.6 1.5 sd1_acd_gkhsa 1.2 1.3 1.5
r11_bcd_gkhsa 1.0 1.5 1.7 sd1_bcd_gkhsa 1.8 1.5 1.9
r11_xyz_gkhsa 1.0 1.5 1.9 sfs_xyz_gkhsa 1.4 1.6 1.4
sfs_ryb_gkhsa 1.5 1.2 1.7

답변2

join, sortsed:을 사용하십시오 .

join -j 2 -t_ -a 1 -a 2  -o 1.1,1.2,1.3,1.9999,2.1,2.2,2.3 \
     <(sort -t_ -k2 file1) <(sort -t_ -k2 file2) | \
     sed 's/__/  /g;s/^ *//g' | sort
  1. sort 파일 1&파일 2bash의 *process 대체를 사용 하고...
  2. _필드 구분 기호를 사용하면 join두 파일 모두 필드 #2의 공통 인스턴스로 정렬되며 두 파일에서 일치하지 않는 줄도 개별적으로 인쇄됩니다. 존재하지 않는 필드 1.9999각 조인 쌍을 추가 필드로 분리하여 _3단계를 단순화합니다.
  3. 보기 흉한 출력을 정리하는 데 사용합니다 sed.
  4. sort결과.

산출:

r11_abc_gkhsa 1.0 1.5 1.9  ab1_abc_gkhsa 1.6 1.4 1.5
r11_acd_gkhsa 1.3 1.6 1.5  sd1_acd_gkhsa 1.2 1.3 1.5
r11_bcd_gkhsa 1.0 1.5 1.7  sd1_bcd_gkhsa 1.8 1.5 1.9
r11_xyz_gkhsa 1.0 1.5 1.9  sfs_xyz_gkhsa 1.4 1.6 1.4
sfs_ryb_gkhsa 1.5 1.2 1.7

관련 정보