разделить файлы по определенному шаблону

разделить файлы по определенному шаблону

Файл, с которым я работаю, выглядит так:

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

Связанный контент