2016-09-19 2 views
-1

Я хочу напечатать конкретный столбец (в этом случае столбец 7) моего файла в научной нотации, тогда как остальные столбцы печатаются как есть.awk printf определенный столбец в файле

Как я могу выборочно использовать printf только для столбца 7 и только print для первых 6 столбцов?

Пример ввода:

C 6 12.011 0.51 3.56E-01 4.60E-01 0.458399 
CA 6 12.011 -0.15 3.55E-01 2.93E-01 0.291708 
CAI 6 12.011 -0.25 3.55E-01 3.05E-01 0.30421 
CC 6 12.011 0.62 3.56E-01 2.93E-01 0.291708 

желаемый результат:

C 6 12.011 0.51 3.56E-01 4.60E-01 4.58E-01 
CA 6 12.011 -0.15 3.55E-01 2.93E-01 2.92E-01 
CAI 6 12.011 -0.25 3.55E-01 3.05E-01 3.04E-01 
CC 6 12.011 0.62 3.56E-01 2.93E-01 2.92E-01 
+0

ли ваши столбцы фиксированной ширины? Всегда ли это последний столбец, который вы хотите изменить? –

+0

awk '{print $ 1, $ 2, $ 3, $ 4, $ 5, $ 6}' input.txt> temp1 awk '{printf "% 4.3e" $ 7}' input.txt> temp2 Я получаю ошибку: awk: (FILENAME = input.txt FNR = 1) со смертельным исходом: не достаточно аргументов, чтобы удовлетворить строку формата \t '% 4.3e0.458399' Я думал, вставит TEMP1 temp2> output.txt Однако, я предпочитаю, если я мог бы сделать все это за один шаг/команда – ruchi

+0

Нет, это не всегда последний столбец, который мне нужно изменить для научной нотации. – ruchi

ответ

1

Вы можете использовать sprintf:

$ awk -v OFS="\t" '{ $7 = sprintf("%.2E", $7) }1' input.txt 
C 6 12.011 0.51 3.56E-01 4.60E-01 4.58E-01 
CA 6 12.011 -0.15 3.55E-01 2.93E-01 2.92E-01 
CAI 6 12.011 -0.25 3.55E-01 3.05E-01 3.04E-01 
CC 6 12.011 0.62 3.56E-01 2.93E-01 2.92E-01 
+0

или '{sub ($ 7, sprintf ("% 4.2E ", $ 7))} 1' – karakfa

+1

@karakfa с использованием' sub' с полем в качестве шаблона поиска не похоже на очень безопасный вариант. –

+0

Да, вы можете добавить целевые $ 7 к югу, но также потребуется переформатировать, поэтому не полезно. – karakfa

0

Чтобы изменить только последний столбец, не затрагивая расстояние других полей:

$ cat ip.txt 
C 6 12.011 0.51 3.56E-01 4.60E-01 0.458399 
CA 6 12.011 -0.15 3.55E-01 2.93E-01 0.291708 
CAI 6 12.011 -0.25 3.55E-01 3.05E-01 0.30421 
CC 6 12.011 0.62 3.56E-01 2.93E-01 0.291708 

$ perl -pe 's/\S+$/sprintf "%.2E", $&/e' ip.txt 
C 6 12.011 0.51 3.56E-01 4.60E-01 4.58E-01 
CA 6 12.011 -0.15 3.55E-01 2.93E-01 2.92E-01 
CAI 6 12.011 -0.25 3.55E-01 3.05E-01 3.04E-01 
CC 6 12.011 0.62 3.56E-01 2.93E-01 2.92E-01 

Если требуется какой-либо другой столбец:

$ perl -pe 's/^(\S+\s+){2}\K\S+/sprintf "%.2E", $&/e' ip.txt 
C 6 1.20E+01 0.51 3.56E-01 4.60E-01 0.458399 
CA 6 1.20E+01 -0.15 3.55E-01 2.93E-01 0.291708 
CAI 6 1.20E+01 -0.25 3.55E-01 3.05E-01 0.30421 
CC 6 1.20E+01 0.62 3.56E-01 2.93E-01 0.291708 
Смежные вопросы