Awk условное if else - PullRequest
       7

Awk условное if else

0 голосов
/ 28 мая 2020

у меня есть файл, который не хочет нарушать последовательность, поэтому я пытаюсь разработать условный оператор awk.

если $ 3 имеет TB (строка), удалите его и умножьте на 1024, и если у него есть ГБ, просто удалите его (удалите строку ГБ) и ничего не делайте.

sast1sis01_002          iresas-p2-ris03    100.00GB   60050912017086C7700000000000021E
sast1sis01_004          iresas-p2-ris03    50.00TB    60050912017086C77000000000000AAF
sast1sis01_003          iresas-p2-ris03    100.00GB   60050912017086C77000000000000BB0
sast1sis01_008          iresas-p2-ris03    100.00GB   60050912017086C77000000000000OO1
sast1sis01_005          iresas-p2-ris03    100.00GB   60050912017086C77000000000000212
sast1sis01_001          iresas-p2-ris03    100.00GB   60050912017086C77000000000000993
arrysas1_356            cbscc-u8-msas1     600.00GB   60050912017086C77000000000000BBA
N8DVP01ABC_007          iresas-z1-pit02    2.44TB     60050912017086C770000000000005EE
n2sql90abc_052          iresas-p2-sql57a   1.00TB     60050912017086C7700000000000089C
n3sq321abc_055          iresas-p2-sql57b   0          60050912017086C7700000000000011C
n6sq222abc_056          iresas-p2-sql57a   1.00GB     60050912017086C7700000000000022D
n7sqbascka_058          iresas-p2-sql57b   0          60050912017086C7700000000000039D

Попробуйте это:

awk '{s=($3=="TB")?"-":$3=$3*1024; print}';awk '{s=($3=="GB")?"-":'s/GB//g'; print}' file

Ответы [ 3 ]

3 голосов
/ 28 мая 2020
awk '$3 ~ /TB$/ { $3 *= 1024 }; $3 ~ /GB$/ { $3 += 0 }; 1'

Приведенная выше команда работает. awk преобразует строки в числа автоматически из начальной части строки. Здесь игнорируются части GB и TB.

Если вам важны две цифры точности после запятой, даже если они просто нули, вы можете использовать

awk '$3 ~ /TB$/ { $3 *= 1024 }; $3 ~ /GB$/ { $3 += 0 };  {$3 = sprintf("%.2f", $3) } 1'
3 голосов
/ 28 мая 2020

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

awk '
$3~/[tT][bB]$/{
  temp=substr($3,1,length($3)-2)
  $3=temp*1024
}
$3~/[gG][bB]/{
  $3=substr($3,1,length($3)-2)
}
1
' Input_file |column -t

Пояснение: Добавление подробного объяснения к вышеизложенному.

awk '                                   ##Starting awk program from here.
$3~/[tT][bB]$/{                         ##Checking condition if 3rd field is equal to tT OR bB then do following.
  temp=substr($3,1,length($3)-2)        ##Creating variable temp  which has sub-string from 3rd field.
  $3=temp*1024                          ##Re-creating 3rd field which has value of temp variable and multiplying it with 1024 here.
}
$3~/[gG][bB]/{                          ##Checking condition if 3rd field is having gG OR bB then do following.
  $3=substr($3,1,length($3)-2)          ##Re-creating 3rd field which has value of 3rd field apart from last 2 char of it.
}
1                                       ##Printing current line here.
' Input_file | column -t                 ##Putting output of awk program to column command to beautify it.
1 голос
/ 28 мая 2020

Поскольку это данные фиксированной ширины, с помощью GNU awk вы можете написать:

gawk '
  BEGIN {FIELDWIDTHS = "24 19 11 *"; OFS=""}
  {$3 = sprintf("%-11.2f", $3 * ($3 ~ /TB/ ? 1000  : 1))}
  1
' file

выводит:

sast1sis01_002          iresas-p2-ris03    100.00     60050912017086C7700000000000021E
sast1sis01_004          iresas-p2-ris03    50000.00   60050912017086C77000000000000AAF
sast1sis01_003          iresas-p2-ris03    100.00     60050912017086C77000000000000BB0
sast1sis01_008          iresas-p2-ris03    100.00     60050912017086C77000000000000OO1
sast1sis01_005          iresas-p2-ris03    100.00     60050912017086C77000000000000212
sast1sis01_001          iresas-p2-ris03    100.00     60050912017086C77000000000000993
arrysas1_356            cbscc-u8-msas1     600.00     60050912017086C77000000000000BBA
N8DVP01ABC_007          iresas-z1-pit02    2440.00    60050912017086C770000000000005EE
n2sql90abc_052          iresas-p2-sql57a   1000.00    60050912017086C7700000000000089C
n3sq321abc_055          iresas-p2-sql57b   0.00       60050912017086C7700000000000011C
n6sq222abc_056          iresas-p2-sql57a   1.00       60050912017086C7700000000000022D
n7sqbascka_058          iresas-p2-sql57b   0.00       60050912017086C7700000000000039D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...