Могут быть какие-то волшебные суперпупер мэшапы команд, но иногда «линейный» легче всего понять и поддерживать.
Итак, нам просто нужно отслеживать имя файла на основе строки заголовка и добавлять данные. Затем мы можем sort -u
результаты, чтобы получить уникальные строки:
#!/bin/bash
# Clean out old results from previous runs
/bin/rm -f ko*
for file in $@
do
filename=UNKNOWN
echo Processing $file
while read -r line
do
case $line in
ko:*) printf "%s\n" "$line" >> $filename ;;
ko*) filename=${line%% *} ; echo Switching to $filename ;;
"") # Do nothing
;;
*) echo Ignoring unknown line: $line
esac
done < $file
done
for file in ko*
do
echo Making unique: $file
sort -u -o $file $file
done
Мы можем запустить это с тремя исходными файлами:
$ ./pattern_split file1 file2 file3
Processing file1
Switching to ko00980
Switching to ko00982
Switching to ko00983
Processing file2
Switching to ko00980
Switching to ko00982
Switching to ko00983
Processing file3
Switching to ko00980
Switching to ko00982
Switching to ko00983
Making unique: ko00980
Making unique: ko00982
Making unique: ko00983
Мы видим, что он создал три файла, которые были сделаны уникальными. Рассмотрим первое:
$ cat ko00980
ko:K00001 E1.1.1.1; alcohol dehydrogenase [EC:1.1.1.1]
ko:K00079 CBR1; carbonyl reductase 1 [EC:1.1.1.184 1.1.1.189 1.1.1.197]
ko:K00121 frmA; S-(hydroxymethyl)glutathione dehydrogenase / alcohol dehydrogenase [EC:1.1.1.284 1.1.1.1]
ko:K00699 UGT; glucuronosyltransferase [EC:2.4.1.17]
ko:K00799 GST; glutathione S-transferase [EC:2.5.1.18]
ko:K07408 CYP1A1; cytochrome P450, family 1, subfamily A, polypeptide 1 [EC:1.14.14.1]
ko:K07409 CYP1A2; cytochrome P450, family 1, subfamily A, polypeptide 2 [EC:1.14.14.1]
Теперь это решение должно быть усилено против ложных данных в файлах данных (например, что, если есть файл ko123 / 456
? Это сломается. Но это схема того, как можно решить проблему.