Как правильно отформатировать вывод с помощью команды Awk printf?

Пожалуйста, попробуйте :::::

given::
echo $ADMIN_IPS 

8.8.10.1,8.8.10.2,8.8.10.3

и входной файл / tmp / myvar с содержимым, как показано ниже: ::

-A INPUT -i @ PUBLIC_INTERFACE @ -p tcp -m tcp --dport 80 -d @ PUBLIC_IP @ --syn -j ACCEPT

-A INPUT -i @ PUBLIC_INTERFACE @ -p tcp -m tcp --dport 22 -d @ PUBLIC_IP @ -s @ ADMIN_IPS @ --syn -j ACCEPT

-A INPUT -i @ PUBLIC_INTERFACE @ -p tcp -m tcp --dport 443 -d @ PUBLIC_IP @ --syn -j ПРИНЯТЬ

while read j; do savedline=$(echo "$j"|sed 's/@PUBLIC_INTERFACE@/eth0/'|sed 's/@PUBLIC_IP@/1.1.1.1/'); for i in $(echo $ADMIN_IPS |tr ',' '\n'); do echo $savedline|sed "s/@ADMIN_IPS@/$i/";done|uniq;done < /tmp/myvar

Попытайтесь сообщить нам об этом.

3
20.12.2016, 22:46
2 ответа

У вас есть поля в правильном порядке, но ваш первый оператор печати добавляет новую строку (разделитель выходной записи), поэтому ваши данные есть, но просто неожиданно упакованы.

Вторая проблема заключается в том, что вы указываете printf использовать ширину 4; который включает десятичную точку и две цифры после нее, оставляя только одну для ведущей цифры и ни одной для любого заполнения. Попробуйте использовать ширину 5, чтобы ваши данные были дополнены до четырех общих чисел. Если вы хотите, чтобы перед десятичной точкой было 4 цифры , вместо этого измените ширину на 7.

Это самое короткое изменение, которое я внес в вашу программу в то, что, как мне кажется, вы хотите:

awk -F"|" '{
  format = "%05.2f,%05.2f,%05.2f"; 
  print $1","$2","$3","$4"," sprintf(format, $5,$6,$7)}' filename

Я объединил несколько блоков {} в один, а также объединил операторы печати в один.

Если бы мне пришлось написать ваш оператор awk с нуля, я мог бы сделать что-то вроде этого:

awk -v FS=\| -v OFS=, '{
  $5=sprintf("%05.2f", $5); 
  $6=sprintf("%05.2f", $6); 
  $7=sprintf("%05.2f", $7); 
  print $1,$2,$3,$4,$5,$6,$7}' filename

Он явно устанавливает разделитель входных полей, разделитель выходных полей, явно преобразует каждое из полей отдельно, а затем печатает желаемые поля с разделением OFS.

4
27.01.2020, 21:13

Один из способов сделать это:

awk -F \| -v OFS=, '{ NF--; for(i = NF-2; i <= NF; i++) $i = sprintf("%07.2f", $i) } 1' filename
2
27.01.2020, 21:13

Теги

Похожие вопросы