
У меня есть два файла, 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
Я хочу сопоставить "abc, bcd, acd и xyz" из file1 с 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&файл2используяbash
подстановку *process, затем...- Используя
_
в качестве разделителя полейjoin
два отсортированных файла по общим экземплярам поля № 2, а также печатая по отдельности любую строку из любого файла, которая не совпадает. Несуществующее поле1.9999
разделяет каждую объединенную пару с дополнительным_
для упрощения шага № 3. - Удалите некрасивые фрагменты вывода с помощью
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