AWK вычитает числовую запись два из записи один

Я не могу решить очень простую задачу. Мой файл данных выглядит так:

Crap Crap 0.123456789D+09 Crap Crap
Crap Crap 0.123456798D+09 Crap Crap

Мне нужно использовать AWK, чтобы вычесть число из третьего столбца; ВТОРАЯ строка минус ПЕРВАЯ строка.

Я старался:

cat crap.txt | awk '{ A[NR-1] = $3 } END { print A[1] - A[0] }'

ни к чему успеху. Может формат номера неправильный? (Может ли AWK читать экспоненциальную нотацию с помощью D вместо E?)

Помощь!

ИЗМЕНИТЬ:

Просто чтобы сообщество знало, AWK не понимает научную нотацию, которая использует D вместо E (как производят многие выходные данные Fortran). Нужно заменить D на E, а затем произвести любую математическую операцию.


person Escualo    schedule 24.12.2009    source источник
comment
Между прочим, бесполезное использование cat (кроме смешного кошачьего дерьма).   -  person Dennis Williamson    schedule 24.12.2009


Ответы (2)


Вы можете изменить нотацию на лету...

cat crap.txt | awk '{ sub(/D/,"E",$3); A[NR-1] = $3; } END { print A[1] - A[0] }'
person Jeremy Miller    schedule 24.12.2009
comment
потерять кошку и передать имя файла напрямую в awk - person ghostdog74; 25.12.2009

awk не может читать D-нотацию (кстати, что это значит?). Вот пример:

printf "1.2D+1\n1.2E+1\n12\n" | awk '{ print $1/3; }'
0.4
4
4

Первый неправильный.

person sastanin    schedule 24.12.2009
comment
В Фортране нотация D обозначает действительное число с двойной точностью. Так что это то же самое, что и E для всех практических целей. Кстати, Python тоже не может его прочитать! - person Escualo; 24.12.2009