Я пытаюсь манипулировать файлом, который содержит цифры в научной нотации, но без e
символа, т.е. 1.2e+3
записывается как 1.2+3
.
Самой простой вещью, с которой я думал, awk
было заменить ее +
с e+
помощью gsub
функции и выполнить мои вычисления в новом файле. То же самое касается минус дела. Таким образом, простое исправление может быть сделано с помощью следующей команды
awk '{gsub("+", "e+", $1); print $1, $2, $3, $4, $5}' file_in
и сделать то же самое во всех столбцах.
Однако файл также содержит отрицательные числа, что немного усложняет ситуацию. Пример файла можно увидеть ниже
1.056000+0 5.000000-1 2.454400-3 2.914800-2 8.141500-6
2.043430+1 5.000000-1 2.750500-3 2.698100-2-2.034300-4
3.829842+1 5.000000-1 1.969923-2 2.211364-2 9.499900-6
4.168521+1 5.000000-1 1.601262-2 3.030919-2-3.372000-6
6.661784+1 5.000000-1 5.250575-2 3.443669-2 2.585500-5
7.278104+1 5.000000-1 2.137055-2 2.601701-2 8.999800-5
9.077287+1 5.000000-1 1.320498-2 2.961020-2-1.011600-5
9.248130+1 5.000000-1 3.069610-3 2.786329-2-6.317000-5
1.049935+2 5.000000-1 4.218794-2 3.321955-2-5.097000-6
1.216283+2 5.000000-1 1.432105-2 3.077165-2 4.300300-5
Любая идея о том, как манипулировать и расчеты с таким файлом?
text-processing
awk
Танос
источник
источник
Ответы:
Этот вывод правильный?
Код:
Объяснение:
-lne
позаботиться об окончаниях строк, обработать каждую строку ввода, выполнить следующий кодs/(\.\d+)(\+|\-)/\1e\2/g
:s
)(.\d+)(\+|\-)
найти две группы (точка и цифры) и (плюс или минус)\1e\2
замените их первой группой, затемe
второй группойg
глобально - не останавливайтесь на первой замене в каждой строке, но обрабатывайте все возможные попаданияprint
напечатать строкуsample
входной файлЭтот добавляет пространство, если оно отсутствует. На самом деле это ставит пробел между числами независимо. То есть. если бы в некоторых случаях было два пробела, в выходных данных был бы только один.
Большая часть похожа на предыдущую. Новым является
(\d+)
группа № 3 и(\s*)
группа № 4.*
Здесь это означает, что необязательно. В подстановке нет\4
используется. Вместо этого есть пробел.Вывод такой:
источник
.
в первой группе. Это правильно. Без этой обратной косой черты точка не означала бы буквальную точку.Вы также можете использовать
sed
, например:Однако это не учитывает, что столбцы в списке OP иногда не разделяются. Вот обходной путь с соответствующей точностью:
Вывод:
источник
2.698100-2-2.034300-4
OFMT
переменную, чтобы установить точность awk,