Пример подоболочки без дочернего -процесса оболочки

Вы можете сделать это несколькими способами, как показано:

$ grep -vP '^(?:(?!\t).)+\tNA\tNA(?=\t|$)' inp.tsv

$ sed -Ee 'h;s/\t/\n/;s/$/\t/;/\n(NA\t)\1/d;g' inp.tsv

$ perl -F'\t' -lane 'print if 2 != grep { /^NA$/ } @F[1,2]' inp.tsv

$ perl -MList::MoreUtils=any -F'\t' -lane 'print if any { ! /^NA$/ } @F[1,2]' inp.tsv

   # fs => field separator set to a TAB
   # nT => not TAB
   # F  => consecutive run of non TABs, a field
$ fs="`echo x | tr x '\011'`"; nT="[^${fs}]"; F="$nT$nT*"
$ sed -e "/^$F${fs}NA${fs}NA\$/d" -e "/^$F${fs}NA${fs}NA${fs}/d";exit

Результаты:

TRINITY_DN12995_c0_g1_i1.p1 PF06799 NA
TRINITY_DN6047_c0_g1_i1.p1  PF10585 GO:0008641
TRINITY_DN37780_c0_g1_i3.p2 PF00071 GO:0003924,GO:0005525
TRINITY_DN29879_c0_g1_i3.p1 PF01657 NA
TRINITY_DN72702_c0_g1_i1.p1 PF00498 GO:0005515
TRINITY_DN24890_c0_g1_i7.p1 PF00854 GO:0016020,GO:0022857,GO:0055085
TRINITY_DN46477_c0_g1_i1.p1 PF00069 GO:0004672,GO:0005524,GO:0006468

Предположения:

  • Нет начальных вкладок
  • Окончания строк в стиле Unix => символ новой строки =\012
  • Языковой стандарт установлен на LC _ALL=T
  • Входной файл доступен для чтения пользователем
  • Версия
  • grepподдерживает опцию -P
  • sedподдерживает не -конструкции POSIX, такие как \t, \nна RHS,(...)
  • Запуск в bash|shкомандной строке
0
11.11.2021, 20:54
1 ответ

Я полагаю, что вы неправильно интерпретируете «подоболочку» и «подпроцесс» (, также известный как дочерний процесс ), и справочная страница bash не очень помогает в прояснении путаницы.

Подоболочка — это примерно то, что вы получаете, когда текущая оболочка вызывает fork(). Форк создает подпроцессы; поэтому подоболочка является подпроцессом.

На справочной странице bash сказано, что bash «выполняет команды в подоболочке», но из этого неясно, что для запуска внешних процессов (, таких как ps), он затем вызывает exec()в подоболочке, заменяя работающая подоболочка bash с исполняемым файлом новой команды. В некоторых случаях, например, когда ()используется в bash, подоболочка запускается (и завершается при ), а промежуточные команды могут запускаться в своих собственных подоболочках/подпроцессах.

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

1
12.11.2021, 00:00

Теги

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