Нет, переменные, заданные в одном скрипте, не отображаются в другом скрипте. Оба сценария выполняются в своих отдельных средах.
Пример:
bash -c 'a=1; echo $a'
bash -c 'echo $a'
Второй вызов bash
никогда никогда не запишет 1
в качестве вывода, независимо от того, в каком порядке выполняются две строки или выполняются ли они одновременно.
Единственный случай, когда вторая строка будет выводить 1
, это если есть переменная среды (экспортируемая переменная оболочки )с именем a
в вызывающей ее среде.
Вы можете попробоватьawk
:
awk -F'\t' '!($2 == "NA" && $3 == "NA")' file
Опция -F
устанавливает разделитель полей в \t
, позволяя захватить 2-й и 3-й параметр и проверить, не является ли их содержимое NA
. В таком случае awk
печатает строку.
Ваш скрипт также удаляет строки только с одним NA
, поэтому просто добавьте еще одну, разделенную пробелом-разделителем (? вкладка? Скажем[[:space:]]*
)и зафиксируем его в конце строки с $
, чтобы сделать его поля 2 и 3:
sed -i '/NA[[:space:]]*NA$/d' file.txt
Вы можете сделать это несколькими способами, как показано:
$ 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
Предположения:
\012
grep
поддерживает опцию -P
sed
поддерживает не -конструкции POSIX, такие как \t
, \n
на RHS,(...)
bash|sh
командной строке Пробовал использовать команду «Ниже» и работал нормально
команда
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