Читать числа с е в awk
Привет файл, с которым я работаю, выглядит:
header
//
SeqT: {"POS-s":174.683, "time":0.0130084}
SeqT: {"POS-s":431.49, "time":0.0221447}
[2.04545e+2]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001);
[29]:((962:0.000580339,930:0.000580339):0.00543993);
absolute:
gthcont: 5 4 2 1 3 4 543 5 67 657 78 67 8 5645 6
01010010101010101010101010101011111100011
1111010010010101010101010111101000100000
00000000000000011001100101010010101011111
Используя этот код из awk
!body && /^\/\/$/ {body=1}
body && sub(/^gthcont: */,"") {print > "second_"FILENAME}
body && /^[01]+/ {print > "third_"FILENAME}
body && /^\[[0-9]+\]/ {
print > "first_"FILENAME
print substr($0, 2, index($0,"]")-2) > "fourth_"FILENAME
}
sub(/^SeqT: {"POS-s":/,"") && sub(/, "time":/," ") && sub(/}$/,"") { print >"fifth_"FILENAME}
Мне нужно, чтобы он был разделен на пять файлов. Первый файл
[2.04545e+2]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001);
[29]:((962:0.000580339,930:0.000580339):0.00543993);
Второй файл должен быть
5 4 2 1 3 4 543 5 67 657 78 67 8 5645 6
Следующий файл должен быть
01010010101010101010101010101011111100011
11110100100101010101010101111010001000001
00000000000000011001100101010010101011111
четвертый файл должен иметь числа из скобок в первом файле.. в этом случае это будет только
2.04545e+2
29
и последний файл
174.683 0.00130084
431.49 0.0221447
Код работает, но проблема в том, что у него есть проблемы с использованием научной нотации (e+7 и что-то вроде этого). В этой строке нет распечатки в файле, содержащей только цифры из []. Таким образом, в настоящее время файл не выглядит как 2.04545e+2 29, а только
29..
Как я могу настроить awk, чтобы читать в научной нотации в []?
1 ответ
Вам необходимо заменить регулярное выражение /^\[[0-9]+\]/
, который соответствует только одной или нескольким цифрам в квадратных скобках, с регулярным выражением, которое соответствует вашему вводу с плавающей точкой.
Например, взяв выражение
[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?
для числа с плавающей запятой с показателем степени из сопоставления чисел с плавающей запятой Яна Гойваэрта с руководством по регулярным выражениям и подстановки его в свой код awk:
awk 'BEGIN{body=0}
!body && /^\/\/$/ {body=1}
body && /^\[/ {print > "first_"FILENAME}
body && /^pos/{$1="";print > "second_"FILENAME}
body && /^[01]+/ {print > "third_"FILENAME}
body && /^\[[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\]/ {
print > "first_"FILENAME
print substr($0, 2, index($0,"]")-2) > "fourth_"FILENAME
}' file
с вашим примером ввода в file
, теперь вы должны получить
$ cat fourth_file
2.04545e+2
29