2016-04-01 8 views
0

Возможно ли получить bc для вычисления на основе вывода команды cut?Выполнение вывода операции вырезания на bc

Допустим, у меня есть следующий столбец файл на основе:

PAK_01896  PAU_03392  75.8 149  32  1  1  145  1  149  *  * 
PAK_02014  PAU_03392  69.8 149  45  0  1  149  1  149  *  * 
PAU_02074  PAU_03392  77.2 149  30  1  1  145  1  149  *  * 
PAU_02206  PAU_03392  69.1 149  46  0  1  149  1  149  *  * 
PAU_02775  PAU_03392  79.2 149  31  0  1  149  1  149  *  * 
PAK_02606  PAU_03392  78.5 149  32  0  1  149  1  149  *  * 
PAU_01961  PAU_03392  67.1 149  49  0  1  149  1  149  *  * 
PAK_03203  PAU_03392  95.3 149  7  0  1  149  1  149  *  * 
PLT_01716  PAU_03392  76.5 149  35  0  1  149  1  149  *  * 
PLT_01758  PAU_03392  79.2 149  31  0  1  149  1  149  *  * 
PAU_03392  PAU_03392  100.0 149  0  0  1  149  1  149  *  * 
PLT_01696  PAU_03392  78.5 149  32  0  1  149  1  149  *  * 
PLT_02424  PAU_03392  78.5 149  32  0  1  149  1  149  *  * 
PLT_01736  PAU_03392  77.2 149  34  0  1  149  1  149  *  * 
PLT_02568  PAU_03392  67.1 149  49  0  1  149  1  149  *  * 
PAK_01787  PAU_03392  66.4 149  50  0  1  149  1  149  *  * 

Я хотел бы быть в состоянии выполнить некоторые вычисления на определенных областях, например, что-то эффект суммирования и/или усреднения 3-й колонка. В моей голове, я сначала подумал, чтобы попробовать это:

cut -f3 column_based_file.txt | bc 

Но, возможно, это не удивительно просто возвращает значение каждого элемента в столбце 3.

Я знаю, что есть осуществимые решения этого в потоках, таких как this one что Я мог бы использовать, но так как разрез был моим способом манипулирования данными на основе столбцов в bash на некоторое время, мне просто интересно, возможно ли это вообще? Может быть, bc имеет некоторый флаг для чтения в одной строке за один раз и хранить их и т.д.

EDIT Есть некоторые большие решения в резьбе предложили, и в ответах. Из любопытства, так как я так и думал об этом, у кого-нибудь есть решение cut и bc (если по какой-то причине perl или awk недоступны?)

+0

См.: [Команда оболочки для суммирования целых чисел, по одной в строке?] (Http://stackoverflow.com/q/450799/3776858) – Cyrus

+1

Ах, отлично, натолкнулся на то, что я смотрел на 'cut 'и' bc'. –

+0

'sum = $ (sed -r" s/+/\ t/g "sumavg.csv | cut -f 3 | paste -s -d + - \ bc)' для суммы. (Мне нужен шаг sed, чтобы вырезать последовательности пространства на одну вкладку) и 'lc = $ (wc -l sumavg.csv | cut -f1 -d" ")' для подсчета строк (следите за тем, чтобы последняя строка данных заканчивалась с новой строкой), а затем выходы: 'echo $ sum' и' echo 'scale = 3; $ sum/$ lc "| bc' для среднего –

ответ

3

Я бы использовал awk. Это мое скромное мнение лучше подходит для этой задачи. Скажем, ваши данные хранятся в sumavg.csv, то это GNU AWK сценария (sumavg.awk) показывает сумму и среднее значение третьего поля:

{s += $3 } 
END {print "Sum:", s, " Avg: ", s/FNR} 

запустить его с помощью команды awk -f sumavg.awk sumavg.csv.

$3 - это третье поле в каждой строке, END - это особый шаблон, действие которого выполнено в конце, FNR дает количество строк в файле.

+0

А это очень приятно! У меня действительно никогда не было надлежащей причины, чтобы справиться с 'awk', но я подозреваю, что должен сделать это раньше, чем позже ... –

+0

Если бы я хотел, чтобы awk-скрипт печатал имя файла на выходе, как бы я реализовать это? используя 'END {print" Файл был: "'$ 3' и т. д.} выдает синтаксическую ошибку. Я не могу понять, что я делаю неправильно, основываясь на других потоках. –

+0

Используйте 'print FILENAME, 'Sum:", s, "Avg:", s/FNR' в разделе END. –