Awk: Как вырезать аналогичную часть из 2 полей, а затем получить разницу в оставшейся части? - PullRequest
1 голос
/ 08 октября 2011

Допустим, у меня есть 2 поля, отображающие время эпохи в микросекундах:

1318044415123456,1318044415990056

Что я хотел сделать, это:

  1. Вырезать общую частьиз обоих полей: «1318044415»
  2. Получите разницу оставшихся частей: 990056 - 123456 = 866600

Почему я это делаю?Потому что в awk используется IEEE 754 с плавающей точкой, а не 64-битные целые, и мне нужно получить разницу во времени эпохи двух событий в микросекундах.

Спасибо за любую помощь!

РЕДАКТИРОВАТЬ:

Наконец я нашел наибольшее число, которое Awk мог обработать на Snow Leopard 10.6.8: 9007199254740992.

Попробуйте это: echo '9007199254740992' | awk -F ',' '{print $1 + 0}'

Версия Awk была 20070501 (произведенаawk --version)

1 Ответ

2 голосов
/ 08 октября 2011

Вот скрипт awk, который соответствует вашим требованиям:

BEGIN {
    FS = ","
}
{
    s1 = $1
    s2 = $2
    while (length(s1) > 1 && substr(s1, 1, 1) == substr(s2, 1, 1))
    {
        s1 = substr(s1, 2)
        s2 = substr(s2, 2)
    }
    n1 = s1 + 0
    n2 = s2 + 0
    print n2 - n1
}
...