Пожалуйста, попробуйте :::::
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
Попытайтесь сообщить нам об этом.
У вас есть поля в правильном порядке, но ваш первый оператор печати добавляет новую строку (разделитель выходной записи), поэтому ваши данные есть, но просто неожиданно упакованы.
Вторая проблема заключается в том, что вы указываете 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.
Один из способов сделать это:
awk -F \| -v OFS=, '{ NF--; for(i = NF-2; i <= NF; i++) $i = sprintf("%07.2f", $i) } 1' filename