Как ограничить соответствие определенной строки в столбце записи?

Вы продолжаете видеть сообщение, потому что вы перенаправляете не то, что нужно:

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. Во второй строке выведите количество элементов в массиве.

0
27.01.2019, 11:28
2 ответа

Я бы рекомендовал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
0
28.01.2020, 02:23

Есть около трех вещей, которые делают вашу команду,

awk 'NR==1; $3 ~ /^deleterious(*)$/' file1.txt > file2.txt

не работает должным образом:

  1. Разделитель полей ввода в данных — |. Разделитель по умолчанию (, который вы используете ), представляет собой любой набор пробелов или табуляций. Это означает, что $3будет первым символом |в каждой строке.

  2. Бит NR==1вашего кода приведет к тому, что первая строка будет напечатана, несмотря ни на что.

  3. Регулярное выражение, которое вы используете, содержит ошибку выражения. (и )являются особыми в расширенных регулярных выражениях, и их необходимо экранировать. Однако 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

и, таким образом, допускают наличие пробелов или табуляций в начале третьего поля.

3
28.01.2020, 02:23

Теги

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