Tienes razón en que pdfsig
no está en el poppler-utils
que viene con 16.04. Sin embargo, está en poppler-utils
desde 16.10 y posteriores.
Si la compilación de poopler 0.65 se completó con éxito, debería poder ejecutar pdfsig
dando 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.0
o 0.48.0
y descargue el adecuado para su arquitectura (probablemente i386
o amd64
, si tiene una arquitectura x86 de 32 -o 64 -bits ). No necesitará todos los paquetes correspondientes. Ejecute dpkg-query -l |grep poppler
para encontrar los nombres de los paquetes que debe descargar.
Следующий скрипт 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
}
, который удаляет первый и последний символы из двух значений.
Подкладка 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
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