Я работаю с большим количеством файлов с этой структурой:Разбиение файлов на несколько файлов на основе какой-то шаблон и взять какую-то информацию
BEGIN
TITLE=id=PRD000012;PRIDE_Exp_Complete_Ac_1645.xml;spectrum=1393
PEPMASS=946.3980102539062
CHARGE=3.0+
USER03=
SEQ=DDDIAAL
TAXONOMY=9606
272.228 126847.000
273.252 33795.000
END
BEGIN IONS
TITLE=id=PRD000012;PRIDE_Exp_Complete_Ac_1645.xml;spectrum=1383
PEPMASS=911.3920288085938
CHARGE=2.0+
USER03=
SEQ=QGKFEAAETLEEAAMR
TAXONOMY=9606
1394.637 71404.000
1411.668 122728.000
END
BEGIN IONS
TITLE=id=PRD000012;PRIDE_Exp_Complete_Ac_1645.xml;spectrum=2965
PEPMASS=946.3900146484375
CHARGE=3.0+
TAXONOMY=9606
1564.717 92354.000
1677.738 33865.000
END
Эта структура повторяется тысячи раз, но с разными данными внутри. Как вы можете видеть, между некоторыми начинающими, иногда SEQ и USER03 там нет. Это потому, что белок не идентифицирован ... И вот моя проблема.
Я хотел бы знать, сколько белков идентифицировано и сколько неизвестно. Чтобы сделать это, я пытался это:
for i in $(ls *.txt); do
echo $i
awk '/^BEGIN/{n++;w=1} n&&w{print > "./cache/out" n ".txt"} /^END/{w=0}' $i
done
Я нашел это здесь (Split a file into multiple files based on a pattern and name the new files by the search pattern in Unix?)
И затем использовать выходы и классифицировать их:
for i in $(ls cache/*.txt); do
echo $i
if grep -q 'SEQ' $i; then
mv $i ./archive_identified
else
mv $i ./archive_unidentified
fi
done
После этого, я хотел бы взять некоторые данные (пример: спектр, USER03, SEQ, TAXONOMY) из секретных файлов.
for I in $(ls archive_identified/*.txt); do
echo $i
grep 'SEQ' $i | cut -d "=" -f2- | tr ',' '\n' >> ./sequences_ide.txt
grep 'TAXONOMY' $i | cut -d "=" -f2- | tr ',' '\n' >> ./taxonomy_ide.txt
grep 'USER' $i | cut -d "=" -f2- >> ./modifications_ide.txt
grep 'TITLE' $i | sed 's/^.*\(spectrum.*\)/\1/g' | cut -d "=" -f2- >> ./spectrum.txt
done
for i in $(ls archive_unidentified/*.txt); do
echo $i
grep 'SEQ' $i | cut -d "=" -f2- | tr ',' '\n' >> ./sequences_unide.txt
grep 'TAXONOMY' $i | cut -d "=" -f2- | tr ',' '\n' >> ./taxonomy_unide.txt
grep 'USER' $i | cut -d "=" -f2- >> ./modifications_unide.txt
grep 'TITLE' $i | sed 's/^.*\(spectrum.*\)/\1/g' | cut -d "=" -f2- >> ./spectrum_unide.txt
done
Проблема в том, что первая часть скрипта занимает слишком много времени из-за большого размера данных (12-15 гб). Есть ли способ сделать это проще?
Заранее спасибо.
Используйте 'awk' для преобразования каждой записи в CSV данных столбца : SEQ, TAXONOMY, USER, TITLE. Затем используйте 'grep', чтобы разбить этот файл на два: те, у которых есть и без SEQ. Затем используйте 'cut', чтобы вытащить столбцы в отдельные файлы. Альтернативно: просто сделайте все это в 'awk'. – bishop
@bishop Не могли бы вы дать мне несколько подсказок, как я могу это сделать? Я никогда не работал с csv-файлами. – Enrique
Не требуется для CSV: любой ad-hoc формат будет делать. Хитрость заключается в том, чтобы повернуть ваши ориентированные на строки записи в формат, ориентированный на столбцы, потому что вы «работаете против зерна» с исходным форматом данных. – bishop