Вы продолжаете видеть сообщение, потому что вы перенаправляете не то, что нужно:
numbzip=`ls *.plt.zip | wc -l` &>/dev/null
Это перенаправляет stderr присвоения переменной, а не команды ls
. Вы запускаете ls
внутри ``
и перенаправляете вне его. Чтобы перенаправить вывод ошибок ls
, используйте:
numbzip=`ls *.plt.zip 2>/dev/null | wc -l`
Следует отметить, что хотя вышеприведенный способ работает для простых имен файлов, он не сработает, если ваши имена файлов содержат новые строки. Как правило, следует избегать разбора вывода ls
. Вместо этого можно использовать глоббинги shell:
zipfiles=( *.plt.zip )
echo ${#zipfiles[@]}
Первая команда создаст массив zipfiles
, содержимым которого будут все файлы/каталоги, соответствующие глоббингу *.plt.zip
. Во второй строке выведите количество элементов в массиве.
Я бы рекомендовалfgrep
:
fgrep 'deleterious(' file1.txt > file2.txt
Если вы хотите использовать awk
, вам нужно правильное регулярное выражение:
awk -F '|' '$3 ~ /^ deleterious\(.*\)$/' file1.txt > file2.txt
или
awk -F ' \| ' '$3 ~ /^deleterious\(.*\)$/' file1.txt > file2.txt
или
awk '$6 ~ /^deleterious\(.*\)$/' file1.txt > file2.txt
Есть около трех вещей, которые делают вашу команду,
awk 'NR==1; $3 ~ /^deleterious(*)$/' file1.txt > file2.txt
не работает должным образом:
Разделитель полей ввода в данных — |
. Разделитель по умолчанию (, который вы используете ), представляет собой любой набор пробелов или табуляций. Это означает, что $3
будет первым символом |
в каждой строке.
Бит NR==1
вашего кода приведет к тому, что первая строка будет напечатана, несмотря ни на что.
Регулярное выражение, которое вы используете, содержит ошибку выражения. (
и )
являются особыми в расширенных регулярных выражениях, и их необходимо экранировать. Однако deleterious\(*\)
также не будет работать, поскольку \(*
соответствует «любому количеству (
символов».
Чтобы правильно использовать |
в качестве разделителя полей ввода, используйте awk
с -F '|'
. Однако в этом случае вы можете использовать [[:blank:]]*\\|[[:blank:]]*
, чтобы он также включал боковые пробелы/табуляции вокруг символов вертикальной черты (, если они есть ). Обратная косая черта перед |
необходима, чтобы сделать его буквальным символом вертикальной черты. (разделитель полей рассматривается как регулярное выражение, если он длиннее одного символа,и |
выполняет чередование в регулярных выражениях ). Выражение [[:blank:]]*[|][[:blank:]]*
также будет работать, так как |
будет буквальным в [...]
.
Чтобы сопоставить третье поле с deleterious(<anything>)
, мы можем использовать выражение ^deleterious\(.*\)$
. Скобки также должны быть экранированы, так как они являются специальными в регулярных выражениях. В качестве альтернативы можно использовать ^deleterious[(].*[)]$
.
Это означает, что вы должны использовать
awk -F '[[:blank:]]*[|][[:blank:]]*' '$3 ~ /^deleterious\(.*\)$/' file1.txt >file2.txt
При заданных данных это даст
> HGNC:6583 | 1 | deleterious(0.04)
в file2.txt
.
С одиночным|
в качестве разделителя полей можно использовать
awk -F '|' '$3 ~ /^[[:blank:]]*deleterious\(.*\)$/' file1.txt >file2.txt
и, таким образом, допускают наличие пробелов или табуляций в начале третьего поля.