find, xarg, проблема Awk

Вы можете обнулить -вывод с помощьюprintf:

$ printf '%08d\n' $(echo "obase=2; 10" | bc)
00001010
0
03.10.2021, 01:23
1 ответ

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

find./ -maxdepth 1 -type f -name '*.txt' |
awk '
    BEGIN { OFS=","; print "Name", "Number" }
    NR==FNR { ARGV[ARGC++]=$0; next }
    /value/ { print substr(FILENAME,3), $8 }
' - > out.csv

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

Вышеизложенное предполагает, что ни одно из ваших имен файлов не содержит символов новой строки. Если это так, используйте инструменты GNU и добавьте -print0в конец команды findи RS="\0";в раздел BEGIN команды awk. Он также предполагает, что ваши имена файлов не содержат ", так как тогда вывод не будет действительным CSV, но ваш первый скрипт, который, как вы сказали, отлично работает, за исключением проблемы «слишком много аргументов», потерпит неудачу, если ваши имена файлов содержат какой-либо из те так они не должны.

3
03.10.2021, 13:09

Теги

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