как извлечь данные из файлов трассировки с помощью awk и xxd

Я пытаюсь извлечь данные из файлов трассировки и вычислить сумму. Для одного файла работает следующая команда:

   cat avg.txt| gawk '{T+=$1} END {print T "\n"}'

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

     ls *avg* |  xargs -i sh -c " cat {} | gawk '{T+=$1} END {print T "\n"}'"

gawk: {T+=} END {print T n}

gawk: ^ синтаксическая ошибка

Может ли кто-нибудь сказать мне, в чем проблема?


person user3716217    schedule 06.06.2014    source источник
comment
измените свой вызов sh на sh -vxc "..., чтобы вы могли видеть, что он обрабатывается оболочкой. Кроме того, избегайте вашего awk \$1. Удачи.   -  person shellter    schedule 06.06.2014


Ответы (2)


xargs добавляет много сложности:

for file in *avg*; do
    gawk '{T+=$1} END {print FILENAME ": "T}' "$file"
done

Основная проблема с вашим кодом заключалась во внешних двойных кавычках, которые позволяли раскрывать $1 как переменную оболочки.

person glenn jackman    schedule 06.06.2014
comment
Но что, если мы хотим просмотреть тысячи файлов, где поможет xargs -P8, но тогда общее количество будет распределено по этим множественным вызовам awk. Будет ли тогда трубопровод к bc единственным вариантом? - person Amit Naidu; 16.06.2020

С GNU Parallel вы бы сделали это:

sum() {
  gawk '{T+=$1} END {print FILENAME ": "T}' $1
}
export -f sum
parallel sum ::: *avg*
person Ole Tange    schedule 17.07.2014