2016-03-10 3 views
-2

У меня есть файл, который выглядит какMultiple если заявления в AWK

01/11/2015;998978000000;4890********3290;5735;ITUNES.COM/BILL;LU;Cross_border_rub;4065;17;915;INSUFF FUNDS;51;0; 

Есть 13 точка с запятой столбцов.

Я пытаюсь вычислить 9 столбцов для всех строк:

awk -F ';' -vOFS=';' '{ gsub(",", ".", $9); print }' file | 
awk -F ';' '$0 = NR-1";"$0' | 
awk -F ';' -vOFS=';' '{bar[$1]=$1;a[$1]=$2;b[$1]=$3;c[$1]=$4;d[$1]=$5;e[$1]=$6;f[$1]=$7;g[$1]=$8;h[$1]=$9;k[$1]=$10;l[$1]=$11;l[$1]=$12;m[$1]=$13;p[$1]=$14;}; 
if($7="International") {income=0.0162*h[i]+0.0425*h[i]}; 
else if($7="Domestic") {income=0.0188*h[i]}; 
else if($7="Cross_border_rub") {income=0.0162*h[i]+0.025*h[i]} 
END{for(i in bar) print income";"a[i],b[i],c[i],d[i],e[i],f[i],g[i],h[i],k[i],l[i],m[i],p[i]}' 

Как точно сделать несколько, если заявления корректно работать в AWK?

+1

что 'i' в главном цикле (до' END' блока)? – karakfa

+1

Думаю, вам поможет, если вы укажете, что вы хотите вычислить. Я вижу много неэффективности в опубликованном коде. – karakfa

+0

Спасибо за ваше внимание! Для всей уникальной строки в файле я хочу, чтобы распечатать «доход» в новой 1-й колонке, которая зависит от значения 7 столбцов ($ 7) – qiker

ответ

4

awk на помощь!

Вам не нужно многократные awk invocations. Может консолидироваться в один

$ awk -F';' -v OFS=';' '{gsub(",", ".", $9)} 
     $7=="International" {income=(0.0162+0.0425)*$9} 
     $7=="Domestic" {income=0.0188*$9} 
     $7=="Cross_border_rub" {income=(0.0162+0.025)*$9} 
    # what happens for other values since previous income will be copied over 
     {print income, NR-1, $0}' file 

тест с вашим файлом, так как вы не представили достаточный образец для тестирования.

Возможно, лучше, если вы просто назначить скорость

$ awk -F';' -v OFS=';' '{gsub(",", ".", $9); rate=0} 
     $7=="International" {rate=0.0162+0.0425} 
     $7=="Domestic" {rate=0.0188} 
     $7=="Cross_border_rub" {rate=0.0162+0.025} 
     {print rate*$9, NR-1, $0}' file 
+0

Спасибо !!! Но можете ли вы спросить меня, как я могу это сделать, используя для (i в) и несколько операторов/ – qiker

+0

и что мы можем сделать, если в столбце более 3 значений? Я думаю, нужно использовать if-else – qiker

+0

, который будет случай по умолчанию, инициализирует случай по умолчанию в первом блоке (вместо нуля), а остальные совпадения переопределяют значение по умолчанию. Поскольку они являются взаимоисключающими, только один из них будет активен. Вам не нужно использовать цикл в вашем случае (или END-блок), если вы работаете по одной строке за раз. – karakfa

Смежные вопросы