извлечение информации из столбца [закрыто]

Tienes razón en que pdfsigno está en el poppler-utilsque viene con 16.04. Sin embargo, está en poppler-utilsdesde 16.10 y posteriores.

Si la compilación de poopler 0.65 se completó con éxito, debería poder ejecutar pdfsigdando la ruta al binario compilado. Probablemente pueda encontrar la ruta ejecutando find. -type f | grep '/pdfsig$'en el directorio de compilación de poopler. Entonces simplemente corres./path/to/pdfsig

Alternativamente, puede instalar las utilidades poppler -de los paquetes 16.10. Deberá descargar los archivos deb desde aquí . Simplemente busque 0.44.0o 0.48.0y descargue el adecuado para su arquitectura (probablemente i386o amd64, si tiene una arquitectura x86 de 32 -o 64 -bits ). No necesitará todos los paquetes correspondientes. Ejecute dpkg-query -l |grep popplerpara encontrar los nombres de los paquetes que debe descargar.

0
11.09.2018, 01:45
3 ответа

Следующий скрипт awkпредполагает, что 9-й столбец может содержать данные в любом порядке.

Код разделит столбец на ;, за которым следует необязательный пробел. Затем он будет перебирать полученные элементы и разделять их по пробелам на пару ключ-значение. Если ключ (слева от пробела )является любой из двух строк gene_idили gene_name, значение для этого ключа запоминается. Разбор 9-го столбца заканчивается, когда мы нашли наши две строки, после чего столбец перезаписывается и печатается измененная строка.

Код также отбрасывает любые входные данные, которые не содержат как gene_id, так и gene_name.

BEGIN {
    FS = OFS = "\t"
}

{
    n = split($9, a, "; ?")

    found = 0;
    for (i = 1; i <= n; ++i)
        if (split(a[i], b, " ") == 2) {
            if (b[1] == "gene_id") {
                gene_id = b[2]
                ++found
            } else if (b[1] == "gene_name") {
                gene_name = b[2]
                ++found
            }

            if (found == 2) break
        }

    if (found == 2) {
        $9 = gene_id " " gene_name
        print
    }
}

Проверка предоставленных данных:

$ awk -f script.awk <file
chr1    HAVANA  exon    12613   12721  .       +      .       "ENSG00000223972.5" "DDX11L1"
chr1    HAVANA  exon    13221   14409  .       +      .       "ENSG00000223972.5" "DDX11L1"

Чтобы удалить двойные кавычки из значений, измените

if (found == 2) {
    $9 = gene_id " " gene_name
    print
}

в

if (found == 2) {
    gsub("\"", "", gene_id)
    gsub("\"", "", gene_name)
    $9 = gene_id " " gene_name
    print
}

, который удаляет все двойные кавычки из имени гена и идентификатора, или,

if (found == 2) {
    gene_id = substr(gene_id, 2, length(gene_id) - 2)
    gene_name = substr(gene_name, 2, length(gene_name) - 2)
    $9 = gene_id " " gene_name
    print
}

, который удаляет первый и последний символы из двух значений.

1
28.01.2020, 02:23

Подкладка Perl one -. Его можно было бы назвать гольфом немного короче, но я думаю, что это довольно ясно.

perl -F'\t' -lane '
    if (($id, $name) = / \b gene_id \s+ " ([^"]+).+ \b gene_name \s+ " ([^"]+)/x) {
        print join "\t", @F[0..7], $id, $name;
    }
' file

Еще немного "умнее":

perl -F'\t' -E '$,="\t"; say @F[0..7], $g{id}, $g{name} if %g = /\bgene_(id|name)\s+"([^"]+)/g' file
1
28.01.2020, 02:23

awk '{ print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" $6 "\t" $7 "\t" $8 "\t" $10 "\t" $16 ; } ' filename > output

без кавычек и точек с запятой:

awk '{ print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" $6 "\t" $7 "\t" $8 "\t" $10 "\t" $16 ; }' filename | sed -e 's/;//g; s/\"//g;' > output

точнее при использовании только awk:

awk '{ ORS=" "; print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" $6 "\t" $7 "\t" $8 "\t"; gsub(";", "", $10); gsub("\"", "", $10); print $10 "\t"; gsub(";", "", $16) ; gsub("\"", "", $16); print $16 ; ORS="\n" ; print " "; } ' filename > output

1
28.01.2020, 02:23

Теги

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