Есть инструменты, которые позволяют прострелить себе ногу множеством творческих способов. Это сделано для того, чтобы вы могли использовать свое воображение для решения проблем, не ограничиваясь тем, что кто-то считает «разумным».
Выполнение make -j
в небольшом проекте вполне разумно. В других проектах использование -j
без аргументов серьезно ухудшит отзывчивость системы. В некоторых проектах использование параллельных сборок, даже с -j2
, приведет к полному нарушению сборки (файлы, созданные параллельным процессом make, не успевают за другим и т. Д.).
Я бы лично избегал псевдонимов make
в make -j4
(как вы говорите в комментариях).Я считаю, что лучше явно указать машине, что ей делать, чтобы я знал , что она будет делать. Через несколько дней я забуду об этом псевдониме и буду удивляться, почему четыре проекта, которые я создаю в отдельных терминалах, делают мою систему не отвечающей.
Что касается «опасного» ... Это слово означает разные вещи в разных контекстах. Да, это «опасно», потому что может привести к зависанию системы. Да, это «опасно», потому что это может привести к сбою в процессе сборки на полпути. Но нет, это не «опасно» в том смысле, что переформатирует ваш жесткий диск или начнет удалять случайные файлы.
Итак, как это защитить от идиота?
Вот верное пошаговое руководство:
Также обратите внимание, что флаг -j
в BSD make
требует аргумента, и что этот флаг нестандартный (стандарт Unix POSIX не требует ' не упоминаю об этом).
, чтобы перечислить файлы:
попробуйте
awk 'FNR == 1 && $4 == "whatever" { print FILENAME ;}' file1 ... filen |
, который выберет все файлы, имеющие все в четвертом столбике.
Если у вас смешное имя, просто добавьте кавычки.
awk 'FNR == 1 && $4 == "whatever" { printf "\"s\"\n", FILENAME ;}' file1 ... filen |
для обработки одного файла
awk 'NR == 1 && $4 != "whatever" { exit ;} other patterns { other action;}' file
для обработки большого количества файлов
awk 'NR == 1 && $4 != "whatever" { nextfile ;} other patterns { other action;}' file1 ... filen
, которые могут быть прочитаны как
NR == 1 && $ 4! = "Что угодно"
{nextfile;}
другие шаблоны {другое действие;}
awk 'FNR == 1 &&! / что угодно / {следующий файл}; ... здесь остаток сценария awk ... 'list_of_files_to_process
Это должно перейти к следующему файлу для обработки, если только в строке 1 не указано «что угодно».
Я не могу вспомнить, был ли следующий файл
является расширением GNU awk или, если оно доступно и в других awks, тоже. На странице руководства mawk
это не упоминается, но он упоминается на странице руководства для original-awk
. Если это важно для вас, проверьте его, прежде чем полагаться на эту функцию.
Если вы используете GNU awk, вы можете поместить этот тест в блок BEGINFILE
, например:
BEGINFILE { FNR==1 && ! /whatever/ { nextfile } } ;
... remainder of awk script here ...
Предполагая простой файл, разделенный запятыми, где каждая запятая является разделителем (некоторые csv-файлы могут содержать кавычки, которые не должны рассматриваться как разделители полей), следующее выводит каждую строку, кроме заголовка, когда столбец в заголовке имеет значение "SOMESTRING":
awk -F, '
FNR==1 {
for (i=1; i<=NF; i++)
if ($i == "SOMESTRING")
next
nextfile
}
1
' file1 file2 file3 file4
Сравнение строк может быть заменено проверкой подстроки или операцией совпадения регулярного выражения, если это уместно.
nextfile не является частью POSIX AWK, но широко распространен; он доступен по крайней мере в gawk, nawk (используется в системах *BSD), mawk и busybox.