nohup
. nohup
ignora la señal de colgar con SIG_IGN
y luego carga en cadena su programa en el mismo proceso.
Su programa Python restablece rápidamente el manejo de la señal para la señal de colgado, instalando su propio controlador de señal. Ese controlador verifica una función interna (que no está muy bien diseñada, basándose en algunas suposiciones erróneas, si es la que he visto )y decide que el curso de acción apropiado al recibir una señal de colgado es para imprimir ese mensaje y salir.
Su programa Python por diseño no esnohup
-capaz. En un sistema con un shell de control de trabajo y semántica de sesión/trabajo POSIX, debe disown
ejecutar el trabajo para que el shell nunca lo sepa para enviarle una señal de colgado en primer lugar.
(Incluso eso no es suficiente en los sistemas operativos systemd. Debido a que la gente de systemd ha hecho un poco de oreja de cerdo con su mecanismo de sesión de inicio de sesión de espacio de usuario -, también debe asegurarse de que el mecanismo de systemd que indica el apagado del sistema, en lugar de colgar, para iniciar sesiones en cada cierre de sesión tampoco está pateando pulgadas)
$ cat tst.awk
NR==FNR {
groups[++numGroups] = $1
next
}
FNR==1 {
for (i=1; i<=NF; i++) {
f[$i] = i
}
}
{
printf "%s%s%s%s", $1, OFS, $2, OFS
for (groupNr=1; groupNr<=numGroups; groupNr++) {
group = groups[groupNr]
printf "%s%s", $(f[group]), (groupNr<numGroups ? OFS : ORS)
}
}
$ awk -f tst.awk group1 file
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
Если вы хотите, чтобы вкладка вывода -была разделена вместо пустого -, добавьте строку в верхней части скрипта, которая говорит BEGIN { OFS="\t" }
.
Если вы хотите, чтобы выходные данные выглядели визуально табличными, вы можете сделать это с помощью printf
внутри awk или путем передачи вышеуказанного вcolumn
:
$ awk -f tst.awk group1 file | column -t
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
С csvcut
и csvformat
из csvkit
и при условии, что (возможно несколько )пробелов в качестве входных разделителей:
$ csvcut -d' ' -S -c "#CHROM,POS,$(paste -sd, < group1)" group1.data | csvformat -T
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
Вы можете просто сделать это с помощьюawk
:
awk 'NR==1,NR==4 {print $1,$2,$3,$6,$7}' group1 > group1.data
Это просто напечатает поля 1, 2, 3, 6 и 7 первых четырех строк и даст запрошенный вывод и добавит его в файл group1.data
:
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
Если вы хотите, чтобы он выглядел чище, вы можете использовать OFS='\t'
, чтобы установить разделитель в виде табуляции:
awk 'NR==1,NR==4 {print $1,$2,$3,$4,$5}' OFS='\t' group1 > group1.data
Выход:
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
Я тестировал это с разделителями, состоящими из нескольких пробелов, табуляций и их комбинаций, и каждый раз получал эти выходные данные.