Как можно запустить команду в THENCE MAC для нескольких файлов в папке в одном Go?

Я не понимаю, как это можно сделать в Awk без использования массивов. Это было бы удобнее в Gawk, который позволяет элементам массива быть массивами, но это достаточно просто сделать с обычными моделируемыми многомерными массивами Awk.

По сути, нам нужно запомнить входные строки и затем вывести их (с обновленными полями F-I) при изменении ключа. Нам также нужно сделать это в конце файла. Для удобства мы используем функцию вывода, поскольку она неизбежно будет вызываться из двух мест.

Ниже используются фиксированные номера столбцов: 1-6 и 11-12 для стандартных полей данных, где 4 является ключевым полем, а 7-10 - для объединенных полей, которые я назвал тегами из-за отсутствия лучшего названия. Это не лучший стиль, и его, вероятно, следует учитывать в некоторых переменных.

awk -F '\t' '
  function show_and_reset(            i, c) {
    for (i = 1; i <= count; ++i) {
      for (c = 1; c <= 6; ++c) printf "%s\t", data[i,c]
      for (f in tags) printf "%s\t", f;
      for (c = ntags; c <= 3; ++c) printf "\t" 
      for (c = 11; c <= 12; ++c) printf "\t%s", data[i,c]
      print ""
    }
    /* Clear the holding data */
    for (f in tags) delete tags[f]
    ntags = 0;
    count = 0
  }
  /* Record one line of data */
  function record(                   c) {
    ++count;
    for (c = 1; c <= 6; ++c) data[count,c] = $c
    for (c = 11; c <= 12; ++c) data[count,c] = $c
    for (c = 6; c <= 10; ++c) 
      if ($c != "" && !tags[$c]++) ++ntags;
  }
  $4 != key { show_and_reset(); key = $4; }
            { record(); }
  END       { show_and_reset(); }
'
0
12.06.2018, 16:29
2 ответа

Recorra todos los archivos paired1.fqy, para cada archivo, use el nombre para calcular el nombre del archivo paired2.fqcorrespondiente. Luego llame a su programa con estos:

for paired1 in data/*paired1.fq; do
    paired2="${paired1%1.fq}2.fq"  # remove 1.fq from end of name and replace with 2.fq

    if [ ! -f "$paired2" ]; then
        printf 'Missing file:\t%s\n' "$paired2" >&2
        continue
    fi

    prefix="${paired1%_*}" # remove last underscore and everything after
    prefix="${prefix##*/}" # remove directory name from prefix

    # If $paired1 is the string "data/24538_7#1_paired1.fq", then
    # $prefix should now be "24538_7#1"

    mkdir -p "results/STAR/$prefix"

    STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic \
         --readFilesIn "$paired1" "$paired2" \
         --outFileNamePrefix "results/STAR/$prefix/"
done
2
28.01.2020, 02:31

Su expansión de parámetros no está recortando lo suficiente.

Está configurando filea:

file=24538_7#1_paired1.fq

Luego recortar.fq:

$ echo ${file%.fq}
24538_7#1_paired1

Luego agregando_paired1.fq:

$ echo "${file%.fq}_paired1.fq"
24538_7#1_paired1_paired1.fq

Prueba así:

for file in 24538_7#*.fq; do 
    STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic --readFilesIn data/"${file%_paired?.fq}_paired1.fq" data/"${file%_paired?.fq}_paired2.fq" --outFileNamePrefix results/STAR/
done

Sin embargo, esto se ejecutará dos veces por par, ya que cada par tiene dos archivos. Creo que puede que no sea lo que necesitas.


Para ejecutar una vez por par, podría hacer algo como esto:

#!/bin/bash

files=( 24538_7#*.fq )
files=( printf '%s\n' "${files[@]#24538_7#}" | sort -n | awk -F_ '{print $1}' | uniq )

for n in "${files[@]}"; do
    STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic --readFilesIn data/"24538_7#${n}_paired1.fq" data/"24538_7#${n}_paired2.fq" --outFileNamePrefix results/STAR/ 
done
0
28.01.2020, 02:31

Теги

Похожие вопросы