Удаление строки, содержащей строку в двух столбцах

Нет, переменные, заданные в одном скрипте, не отображаются в другом скрипте. Оба сценария выполняются в своих отдельных средах.

Пример:

bash -c 'a=1; echo $a'

bash -c 'echo $a'

Второй вызов bashникогда никогда не запишет 1в качестве вывода, независимо от того, в каком порядке выполняются две строки или выполняются ли они одновременно.

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

3
06.09.2019, 10:13
4 ответа

Вы можете попробоватьawk:

awk -F'\t' '!($2 == "NA" && $3 == "NA")' file

Опция -Fустанавливает разделитель полей в \t, позволяя захватить 2-й и 3-й параметр и проверить, не является ли их содержимое NA. В таком случае awkпечатает строку.

8
27.01.2020, 21:12

Ваш скрипт также удаляет строки только с одним NA, поэтому просто добавьте еще одну, разделенную пробелом-разделителем (? вкладка? Скажем[[:space:]]*)и зафиксируем его в конце строки с $, чтобы сделать его поля 2 и 3:

sed -i '/NA[[:space:]]*NA$/d' file.txt
0
27.01.2020, 21:12

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

$ 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
27.01.2020, 21:12

Пробовал использовать команду «Ниже» и работал нормально

команда

awk '$2 != "NA" && $3 != "NA" {print $0}'  filename

выход

TRINITY_DN6047_c0_g1_i1.p1  PF10585 GO:0008641
TRINITY_DN37780_c0_g1_i3.p2 PF00071 GO:0003924,GO:0005525
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
0
27.01.2020, 21:12

Теги

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