
Файл, с которым я работаю, выглядит так:
NAMES n0 n1 n2 n3 n4 n5 n6 n7
REGION chr 1 100000
404 AAAAAAGA
992 TTTTTTTA
1146 CCCCGGCC
1727 CCCCCACC
1778 GCCCCCCC
Мой желаемый результат (обратите внимание на строку два и на то, как там расположены числа)
file1
NAMES n0 n1 n2 n3 n4 n5 n6 n7
REGION chr 404 992
404 AAAAAAGA
992 TTTTTTTA
file2
NAMES n0 n1 n2 n3 n4 n5 n6 n7
REGION chr 1146 1778
1146 CCCCGGCC
1727 CCCCCACC
1778 GCCCCCCC
Я пробовал в awk
awk 'function print_vals() {
fn="file" c;
print hdr > fn;
print "REGION chr", sn, en >> fn;
for (i in a)
print a[i] >> fn;
} NR == 1 {
hdr=$0;
c=0;
next
} NF==2 && $1 >= 1000000*c {
if (c)
print_vals();
delete a;
i=0;
c++;
sn=$1;
} NF==2 {
a[++i]=$0;
en=$1;
} END {
print print_vals();
}' file
Для выборочных данных это сработало и я получаю вывод, но для реального набора данных этого не происходит. Набор здесьhttps://www.dropbox.com/s/h6ukumbj08cwk99/arg_t1.gz?dl=0 Это выглядит примерно так
NAMES n1 n2 n3 n4 n5 n6 n7 n8 n9 n10 n11 n12 n13 n14 n15 n16 $
REGION chr 1 10000000
69 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
474 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
584 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
627 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
676 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
690 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
894 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
1104 AAAAAAAAAAAAAAAAA
с выходом, который каким-то образом переключается... это не так, как должно быть
NAMES n1 n2 n3 n4 n5 n6 n7 n8 n9 n10 n11 n12 n13 n14 n15 n16 $
REGION chr 69 999927
561321 AAAAAACAAAAAAAAACAAAAAAAAAAAAAAAAAACCCAAAACAACAAAACAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAACAAAAACCAACA$
561362 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
562011 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
562029 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
562162 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
562171
может ли кто-нибудь подсказать, как это исправить, или предложить другую функцию?
решение1
В awk
ассоциативных массивах обход осуществляется в неопределенном порядке. Замените свой
for (i in a)
к
n = i
for(i=1;i<=n;i++)
Чтобы включить ваш awk в скрипт bash, вы можете использовать что-то вроде
#!/bin/bash
for file
do awk -v file="$file" '....' "$file"
done
Убедитесь, что вы запустили chmod a+rx
файл скрипта. Также замените строку
fn="file" c;
в вашем скрипте awk
fn = c "_" file;
Эта строка — то, как строится ваше новое имя файла: переменная awk file
изначально задается как значение имени обрабатываемого файла (синтаксис: awk -v переменная=значение). Переменная awk fn
— это ваше новое имя файла, и это переменная c
, которая содержит число, объединенное с символом _
и переменной имени файла.
Эту команду bash можно запустить с несколькими файлами в качестве аргументов. Они обрабатываются awk один за другим.
Конечный результат:
#!/bin/bash
for file
do awk -v file="$file" 'function print_vals() {
fn = c "_" file;
print hdr > fn;
print "REGION chr", sn, en >> fn;
n = i
for(i=1;i<=n;i++)
print a[i] >> fn;
} NR == 1 {
hdr=$0;
c=0;
next
} NF==2 && $1 >= 1000000*c {
if (c)
print_vals();
delete a;
i=0;
c++;
sn=$1;
} NF==2 {
a[++i]=$0;
en=$1;
} END {
print print_vals();
}' "$file"
done