awk сумма разных файлов, результат сохранен в разных файлах - PullRequest
2 голосов
/ 20 марта 2019

Для упрощения этой команды можно создать файл в каждом каталоге с суммой файлов *traffic*.

Команда:

find /config -maxdepth 2 -name "*traffic*" -exec awk 'BEGIN {sum=0} {for(i=1; i<=NF; i++) sum+=$i } END {print sum > "xx.txt"}' {} +

Я понятия не имею, как заставить awk сохранить файл для каждого пользователя, потому что у меня нет только /config/mark/ У меня также есть config/john и /config/mary и так далее, и я не знаю, как я мог сохраните файл в этом каталоге.

Таким образом, ожидаемый результат будет xx.txt файл в каждой папке с только текущей суммой папок *traffic* файлов, поэтому /config/mark/ должен иметь сумму всех *traffic* файлов, экспортированных в xx.txt, а также /config/john должно быть то же самое, но только с суммой из папки /config/john.

пример ввода 00002 0000000000 0000051327 #test в одном файле, и у меня есть несколько файлов, похожих на этот файл, в каталоге, например /config/mike/traffic1.txt и /config/mike/traffic2.txt с другим значением 00002 0000000000 0000331327 #test, и результат должен быть просто суммой файлов

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

find /config -name '*traffic*' -printf "$PWD:%p\n" | while IFS=":" read FPATH FNAME
do
        echo "FNAME = $FNAME"
        echo "FPATH = $FPATH"
        echo ""
        awk 'BEGIN {sum=0} {for(i=1; i<=NF; i++) sum+=$i } END {print sum >> "'$FNAME'xxxx"}' "$FNAME"
done

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Хорошо, мне удалось найти решение самостоятельно, похоже, $ PWD не сработал, поэтому вместо этого я использовал% h, так что окончательный код, скажем, у нас есть конфигурация папок с трафика файлами в некоторых подпапках из/ config, и вы хотите добавить числа в файлах трафика в файл с именем result.txt

Вот код:

 find /config -name '*traffic*' -printf "%h:%p\n" | while IFS=":" read FPATH FNAME
do
    awk 'BEGIN {sum=0} {for(i=1; i<=NF; i++) sum+=$i } END {print sum >> "'$FPATH/'result.txt"}' $FNAME
done 

Он создаст файл result.txt в каждой папкенаходит трафик файл

0 голосов
/ 20 марта 2019

С GNU awk для ENDFILE, gensub () и RS с несколькими символами (не проверено):

find /config -name '*traffic*' -exec \
awk -v RS='[[:space:]]+' '{sum+=$0} ENDFILE{print sum+0 >> gensub("[^/]+$","xx.txt",1,FILENAME); sum=0}' {} +

или:

find /config -type d -maxdepth 2 |
while IFS= read -r dir; do
    awk -v RS='[[:space:]]+' '{sum+=$0} ENDFILE{print sum+0; sum=0}' "$dir"/*traffic* > "$dir"/xx.txt
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...