Учитывая 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
Другие вопросы по тегам