
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
, sort
및 사용 sed
:
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
sort
파일1&파일2bash
의 *프로세스 대체를 사용 하면..._
필드 구분 기호로 필드 #2의 공통 인스턴스에서 두 개의 정렬된 파일을 사용join
하고 두 파일 중 일치하지 않는 행을 하나씩 인쇄합니다. 존재하지 않는 필드는 3단계를 단순화하기 위해1.9999
조인된 각 쌍을 추가 항목으로 분리합니다 ._
- .
sed
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