2012-04-22 5 views
1

Основываясь на этом вопросе Group files and pipe to awk commandПолучить первые и последние файлы в месяц

У меня есть набор файлов, как это: -

-rw-r--r-- 1 root root 497186 Apr 21 13:17 2012_03_25 
-rw-r--r-- 1 root root 490558 Apr 21 13:17 2012_03_26 
-rw-r--r-- 1 root root 488797 Apr 21 13:17 2012_03_27 
-rw-r--r-- 1 root root 316290 Apr 21 13:17 2012_03_28 
-rw-r--r-- 1 root root 490081 Apr 21 13:17 2012_03_29 
-rw-r--r-- 1 root root 486621 Apr 21 13:17 2012_03_30 
-rw-r--r-- 1 root root 490904 Apr 21 13:17 2012_03_31 
-rw-r--r-- 1 root root 491788 Apr 21 13:17 2012_04_01 
-rw-r--r-- 1 root root 488630 Apr 21 13:17 2012_04_02 

На основании ответа в связанном вопросе у меня есть сценарий с следующий код, который отлично работает: -

DIR="/tmp/tmp" 
for month in $(find "$DIR" -maxdepth 1 -type f | sed 's/.*\/\([0-9]\{4\}_[0-9]\{2\}\).*/\1/' | sort -u); do 
    echo "Start awk command for files $month" 
    power=$(awk -F, '{ x += $1 } END { print x/NR }' "$DIR/${month}"_[0-3][0-9]) 
    echo $power 
done 

следующая команда на его собственной возвращает список, как это: -

find /tmp/tmp -maxdepth 1 -type f | sed 's/.*\/\([0-9]\{4\}_[0-9]\{2\}\).*/\1/' | sort -u 

2011_05 
2011_06 
2011_07 
2011_08 
2011_09 
2011_10 
2011_11 
2011_12 
2012_01 
2012_02 
2012_03 
2012_04 

Команда find передает набор файлов с использованием GLOB-AWK для обработки в виде пакета.

Исходя из этого, я хочу, чтобы иметь возможность запускать следующую вырезать команды

head -1 FirstFile | date -d "`cut -d, -f7`" +%s 

tail -1 LastFile | date -d "`cut -d, -f7`" +%s 

Они должны быть запущены для первого и последнего файла PER SET

Так что для 2012_03 выше, глава должен быть запущен для файла 2012_03_25, и хвост должен быть запущен для 2012_03_31, так как это первый и последний файлы в наборе для марта.

Так что в основном я должен иметь возможность получить ПЕРВЫЙ и ПОСЛЕДНИЙ файл PER BATCH.

Надеюсь, я сделал это достаточно ясно, если не прокомментирую.

ответ

2
DIR="/tmp/tmp" 
for month in $(find "$DIR" -maxdepth 1 -type f | sed 's/.*\/\([0-9]\{4\}_[0-9]\{2\}\).*/\1/' | sort -u); do 
     echo "Start awk command for files $month" 
     IFS=, read start end power < <(awk -F, 'BEGIN{OFS = ","} NR == 1 {printf "%s,", $7} { x += $1; d = $7 } END { print d, x/NR }' "$DIR/${month}"_[0-3][0-9]) 
     echo $power 
     date -d "$start" +%s 
     date -d "$end" +%s 
done 

Вот как вы бы использовать здесь-документ, который должен работать в большинстве оболочек:

 read start end power <<EOF 
$(awk -F, 'NR == 1 {printf "%s ", $7} { x += $1; d = $7 } END { print d, x/NR }' "$DIR/${month}"_[0-3][0-9])) 
EOF 
+0

Мне нравится это решение, но я получаю «Перенаправление неожиданный» при использовании <<() идиома. Я использую стандартную Debian Squeeze. –

+0

@generalexception: Какая оболочка? Я предполагаю, что это не Bash, ksh или zsh, чтобы это могло дать вам ошибку. Вместо этого вы можете попробовать '<<< $()' (здесь-строка с подстановкой команд), но это может сбой, если замена процесса не работает. Вы также можете попробовать здесь-doc. См. Мой отредактированный ответ для примера. –

+0

Его не оболочка, потому что команда awk возвращает дату в виде строки в формате ГГГГ/ММ/ДД ЧЧ: ММ: СС, она назначает ГГГГ/ММ/ДД на $ start, ЧЧ: ММ: от СС до конца и следующий YYYY/MM/DD до $ power. Пробел в этой задаче вызывает проблему. –

Смежные вопросы