awk арифметическая операция из строки - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть определенный столбец в файле, который содержит такие строки:

1.1*1024
1.0*1024
1.1*1024
...

Я хочу получить числовой результат:

1126.4
1024.0
1126.4

Итак, я попробовал это, обратите внимание, чторазмеры указаны в 6-м столбце моего файла:

$ cat file | awk '{col=$6;size=sprintf("%f", col);print "=> col = "col" size = "size}'
=> col = 1.1*1024 size = 1.100000
=> col = 1.0*1024 size = 1.000000
=> col = 1.1*1024 size = 1.100000

EDIT1 Мой входной файл выглядит следующим образом:

$ cat file 
[[  ]]  toto1.mp4  2019-04-16  22:11  1.1*1024
[[  ]]  toto2.mp4  2019-04-16  21:41  1.0*1024
[[  ]]  toto3.mp4  2019-04-16  22:40  1.1*1024
[[  ]]  toto4.mp4  2019-04-16  22:09  1.1*1024
...

Каким-то образом умножение игнорируется.

Можете ли выпомощь?

Ответы [ 6 ]

2 голосов
/ 24 апреля 2019

Это то, что вы пытаетесь сделать?

$ awk -F'[[:space:]*]+' '{printf "%.1f\n", $(NF-1) * $NF}' file
1126.4
1024.0
1126.4
1126.4
2 голосов
/ 24 апреля 2019

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

$ awk '{
    cmd="awk \47BEGIN{print " $6 "}\47"  # prepare an external awk command 
    cmd | getline retval                 # execute
    print retval                         # output evaluated value
    close(cmd)                           
}' file

Выход:

1126.4
1024
1126.4
1126.4

Существуют программы awk, которые могут вычислять, например, calc3. Google твой друг, мой друг.

2 голосов
/ 24 апреля 2019

sprintf не может самостоятельно оценить операции. Вам необходимо проанализировать и оценить их, а затем sprintf можно использовать для преобразования результата в строку с определенным форматом.

$ awk -v OFS='  ' 'split($NF,a,/\*/)>1{$NF=a[1]*a[2]} 1' file
[[  ]]  toto1.mp4  2019-04-16  22:11  1126.4
[[  ]]  toto2.mp4  2019-04-16  21:41  1024
[[  ]]  toto3.mp4  2019-04-16  22:40  1126.4
[[  ]]  toto4.mp4  2019-04-16  22:09  1126.4
2 голосов
/ 24 апреля 2019

Не могли бы вы попробовать следующее (протестировано и написано только после просмотра предоставленных образцов).

awk '{split($NF,array,"*");printf("%.01f\n",array[1]*array[2])}' Input_file
2 голосов
/ 24 апреля 2019

Это общий способ оценки строки, он может обрабатывать *, +, -, / и т. Д. Если вы можете использовать perl, тогда есть опция для eval строки , это вычислит строку для математической операции из ввода.

CASE-1: При оценке всей строки:

cat inputfile
1+1
2*2
3/3
4.5*2
5/2

perl -nle ' print eval ' inputfile
2
4
1
9
2.5

CASE-2: При оценке только одного столбца: в данном случае 6-й столбец. укажите номер столбца для оценки, F [5] - шестой столбец.

perl -nale  'print  eval  $F[5]' inputfile
1126.4
1024
1126.4
1126.4

case-3: При оценке 6-го столбца, но при печати всей записи. Оцените 6-й столбец и обновите его значение, затем напечатайте всю строку.

perl -nale  '$F[5] = eval  $F[5] ;print "@F"' inputfile
[[ ]] toto1.mp4 2019-04-16 22:11 1126.4
[[ ]] toto2.mp4 2019-04-16 21:41 1024
[[ ]] toto3.mp4 2019-04-16 22:40 1126.4
[[ ]] toto4.mp4 2019-04-16 22:09 1126.4
0 голосов
/ 25 апреля 2019

если данные в d файле, попробовал на gnu awk:

 awk -F'\\*' '{a=$1*$2; printf "%-6.1f\n",a}' d
...