Отфильтровать 500 файлов с помощью awk, затем результат cat в один файл

Сообщения указывают на то, что ваш профиль netctl использует dhcpcdв качестве DHCP-клиента, а не dhclient.

Поскольку похоже, что dhclientработает, а dhcpcdнет, вы можете попробовать изменить DHCP-клиент по умолчанию на dhclient.

Либо создайте /etc/netctl/hooks/dhcpсо следующим содержимым:

#!/bin/sh
DHCPClient='dhclient'

Или создайте /etc/netctl/interfaces/eno1со следующим содержимым:

DHCPClient='dhclient'

В обоих случаях пометить файл как исполняемый(chmod a+x ).

5
10.12.2019, 00:41
3 ответа

Просто сделай это:

awk '$5 >=.5' *.imputed.*_info > snplist.txt
5
27.01.2020, 20:31

Ваш код перезаписывает выходной файл при каждой итерации. Вы также фактически не вызываете awk.

Вы хотите сделать что-то вроде

awk '$5 >= 0.5'./*.imputed.*_info >snplist.txt

Это вызовет awkсо всеми вашими файлами одновременно, и он будет проходить их один за другим, в том порядке, в котором оболочка расширяет шаблон подстановки. Если 5-й столбец любой строки в файле больше или равен 0,5, эта строка будет выведена (вsnplist.txt). Это работает, поскольку действие по умолчанию, если никакое действие({...}блока )не связано с условием, заключается в выводе текущей строки.

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

for filename in./*.imputed.*_info; do
    awk '$5 >= 0.5' "$filename"
done >snplist.txt

Обратите внимание, что результат awkне нужно сохранять в переменной. Здесь он просто выводится и цикл(и, следовательно, все команды внутри цикла )перенаправляются в snplist.txt.

Для многих тысяч файлов это было бы довольно медленно, так как awkнужно было бы вызывать для каждого из них отдельно.

Чтобы ускорить работу, в случаях, когда у вас слишком много файлов для одного вызова awk, вы можете рассмотреть возможность использования xargsследующим образом:

printf '%s\0'./*.imputed.*_info | xargs -0 awk '$5 >= 0.5' >snplist.txt

Это создаст список имен файлов с printfи передаст их в xargsкак список, завершающийся нулем -. Утилита xargsбрала их и запускала awkс как можно большим количеством из них одновременно, пакетами. Вывод всего конвейера будет перенаправлен на snplist.txt.

Этот xargsвариант предполагает, что вы используете Unix, например Linux, в котором есть команда xargs, которая реализует нестандартную -опцию -0для чтения ввода, завершаемого нулем -. Также предполагается, что вы используете оболочку, такую ​​как bash, которая имеет , встроенную -вprintfутилиту (ksh, оболочку по умолчанию в OpenBSD,здесь не сработает, так как в утилите )такой встроенной -нет.


Для оболочки zsh(т.е. неbash):

autoload -U zargs
zargs --./*.imputed.*_info -- awk '$5 >= 0.5' >snplist.txt

Здесь используется zargs, которая в основном является повторной реализацией xargsв виде загружаемой zshфункции оболочки. См.zargs --help(после загрузки функции )и руководство zshcontrib(1)для получения дополнительной информации об этом.

14
27.01.2020, 20:31

У меня есть привычка использовать findдля такого рода вещей.

find. -type f -name "*.imputed.*_info" -exec awk '$5 >= 0.5' {} \; >./snplist.txt
3
27.01.2020, 20:31

Теги

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