Учитывая 2 или более файлов TSV и только терминал, как вы можете рассчитать среднюю разницу дат, которые появляются только в обоих?
Допустим, у нас есть несколько файлов:
Файл 1 (дата, значение):
20130510\t50000
20130520\t3400
20130601\t4500
Файл 2 (дата, что-то, значение):
20130511\tx\t123
20130520\ty\t456
20130601\tz\t789
Мы хотим получить среднее значение разницы в значениях, связанных с датами, которые появляются в обоих файлах.
- 20130520 и 20130601 появляются в обоих (нужен какой-то фильтр)
- разница в значениях абс (3400-456) и абс (4500-789)
- среднее значение (абс (3400-456)+ абс (4500-789))/2,0
Я легко могу сделать это на Python, но как насчет awk в терминале?
2 ответа
Использование awk
awk 'NR==FNR{a[$1]=$2;next}
{if ($1 in a) { s+=sqrt((a[$1]-$3)*(a[$1]-$3));i++}}
END{print s/i}' file1 file2
объяснение
- Нет необходимости определять FS как "\t", потому что пробел
tab
sqrt((x-y)*(x-y))
может быть легко использован для функции ABS.
Вы можете попробовать:
awk -f a.awk file1 file2
где a.awk
является:
BEGIN {FS="\t"}
NR==FNR{
x[$1]=$2; next
}
$1 in x {
y[$1]=$3
}
END{
for (i in y) {
s=s+abs(x[i]-y[i])
j++
}
print s/j
}
function abs(x){return ((x < 0.0) ? -x : x)}
Выход:
3327.5