Разбирать файл с помощью Awk только тогда, когда первая строка соответствует шаблону

Есть инструменты, которые позволяют прострелить себе ногу множеством творческих способов. Это сделано для того, чтобы вы могли использовать свое воображение для решения проблем, не ограничиваясь тем, что кто-то считает «разумным».

Выполнение make -j в небольшом проекте вполне разумно. В других проектах использование -j без аргументов серьезно ухудшит отзывчивость системы. В некоторых проектах использование параллельных сборок, даже с -j2 , приведет к полному нарушению сборки (файлы, созданные параллельным процессом make, не успевают за другим и т. Д.).

Я бы лично избегал псевдонимов make в make -j4 (как вы говорите в комментариях).Я считаю, что лучше явно указать машине, что ей делать, чтобы я знал , что она будет делать. Через несколько дней я забуду об этом псевдониме и буду удивляться, почему четыре проекта, которые я создаю в отдельных терминалах, делают мою систему не отвечающей.

Что касается «опасного» ... Это слово означает разные вещи в разных контекстах. Да, это «опасно», потому что может привести к зависанию системы. Да, это «опасно», потому что это может привести к сбою в процессе сборки на полпути. Но нет, это не «опасно» в том смысле, что переформатирует ваш жесткий диск или начнет удалять случайные файлы.

Итак, как это защитить от идиота?

Вот верное пошаговое руководство:

  1. Научитесь пользоваться своими инструментами.

Также обратите внимание, что флаг -j в BSD make требует аргумента, и что этот флаг нестандартный (стандарт Unix POSIX не требует ' не упоминаю об этом).

1
15.02.2016, 19:52
3 ответа

, чтобы перечислить файлы:

попробуйте

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

, которые могут быть прочитаны как

  • IF (условие не выполнено) NR == 1 && $ 4! = "Что угодно"
  • THEN skip этот этот файл {nextfile;}
  • Иначе продолжить другие шаблоны {другое действие;}
2
27.01.2020, 23:16

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 ...
1
27.01.2020, 23:16

Предполагая простой файл, разделенный запятыми, где каждая запятая является разделителем (некоторые 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.

2
27.01.2020, 23:16

Теги

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