добавить вывод каждой итерации цикла к тому же в bash

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

0
задан Sonia Olaechea Lázaro 15 January 2019 в 09:43
поделиться

2 ответа

Может быть, попробовать это.

for chr in chr*.vcf; do
    base=${chr%.vcf}
    awk -v base="$base" 'BEGIN { OFS="\t"
            # Remove this to not have this pesky header line
            print "Chromosome", "VCFCount", "FilteredVCFCount"
            }
        FNR==1 && n { p=n }
        { n=FNR }
        END { print base, p, n }' "$chr" "$base.filtered.vcf"
done >counts.txt

Очень простой скрипт Awk просто собирает наибольший номер строки для каждого файла (поэтому мы в основном переопределяем wc -l) и печатает собранные числа в желаемом формате. FNR - номер строки в текущем входном файле; мы просто сохраняем это и копируем значение в p, чтобы сохранить сохраненное значение из предыдущего файла в отдельной переменной, когда мы переключаемся на новый файл (начиная со строки № 1).

Подстановка параметров оболочки ${variable%pattern} извлекает значение variable с любым совпадением суффикса для удаленного pattern. (Существует также ${variable#pattern}, чтобы удалить префикс, и у Bash есть ## и %%, чтобы обрезать самое длинное совпадение с образцом вместо самого короткого.)

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

0
ответ дан tripleee 15 January 2019 в 09:43
поделиться
printf "%s\n" *.filtered.vcf |
cut -d. -f1 |
sort |
xargs -n1 sh -c 'printf "%s\t%s\t%s\n" "$1" "$(wc -l <"${1}.vcf")" "$(wc -l <"${1}.filtered.vcf")"' -- 
  1. Вывести список файлов, разделенных символом новой строки, в каталоге
  2. Удалить расширение с помощью cut (возможно, что-то вдоль xargs -i basename {} .filtered.vcf будет безопаснее)
  3. Сортировать его хороший отсортированный вывод!) (возможно, что-то в sort -tr -k2 -n будет отсортировано численно и будет еще лучше).
  4. xargs -n1 Для каждого файла выполнить скрипт sh -c
    1. printf "%s\t%s\t%s\n" - вывод со строкой нестандартного формата ...
    2. "$1" - имя файла и ...
    3. "(wc -l <"${1}.vcf")" - подсчитать количество строк в файле .vcf и ...
    4. "$(wc -l <"${1}.filtered.vcf")" - количество строк в .filtered.vcf

Пример:

> touch chr{1..3}{,.filtered}.vcf 
> echo > chr1.filtered.vcf ; echo  > chr2.vcf ; 
>     printf "%s\n" *.filtered.vcf |
>    cut -d. -f1 |
>    sort |
>    xargs -n1 sh -c 'printf "%s\t%s\t%s\n" "$1" "$(wc -l <"${1}.filtered.vcf")" "$(wc -l <"${1}.vcf")"' -- 
chr1    0   1
chr2    1   0
chr3    0   0

Чтобы иметь красивую таблицу с заголовки, используйте column:

> .... | column -N Chromosome,VCFCount,FilteredVCFCount -t -o '    '
Chromosome    VCFCount    FilteredVCFCount
chr1          0           1
chr2          1           0
chr3          0           0
0
ответ дан Kamil Cuk 15 January 2019 в 09:43
поделиться
Другие вопросы по тегам:

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