Да, можно. И нет, не следует (если не работаете в непубличной сети, что кажется очень маловероятным из-за того, что OpenVPN является методом открытого доступа к частной подсети).
Причины, по которым соответствует процессу проверки сертификата протоколов TLS и надежность соединений, когда
Попробуйте это,
awk 'BEGIN{OFS=FS="|"}{$6=sprintf("%1.0f",$6);$8=sprintf("%3.2f",$8);$9=sprintf("%1.0f",$9);$10=sprintf("%1.0f",$10)}1;' tt.txt
010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R| |
010N00000001|20100115|20150115|PA|3|1|41|-50.00|0|0|022|R| |
%X
, где X — обязательные цифры. .xf
, где x — обязательные десятичные дроби. Например, если file
содержит ваши данные:
awk -F\| -v OFS=\| '{ $6 = sprintf( "%.0f", $6 )
$8 = sprintf( "%.2f", $8 )
$9 = sprintf( "%.0f", $9 )
$10 = sprintf( "%.0f", $10 )
print }' file
Опция -F\|
устанавливает разделитель полей ввода ()на символ вертикальной черты; -v OFS=\|
делает то же самое для разделителя выходных полей. Строки с назначениями просто переформатируют соответствующие поля с помощью функцииsprintf()
-(, которая возвращает то, что printf()
напечатала бы с теми же аргументами ), и в конце выводится полная переформатированная запись с помощью print
.
Что касается переформатирования с помощью sprintf()
, вы можете выбрать из множества контрольных букв и связанных модификаторов . Ссылки ведут на документацию GNU awk, но большинство символов довольно универсальны.
numfmt
из пакета GNU Coreutils становится полезным для подобных задач -, к сожалению, он пока не поддерживает несколько --field
,--format
спецификации и, по-видимому, не обрабатывает числа с унарными +
. Немного поругавшись:
$ sed 's/[+ ]//g' file |
numfmt -d'|' --field=8 --format='%.2f' | numfmt -d'|' --field=6,9,10 --format='%.0f'
010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R||
010N00000001|20100115|20150115|PA|3|1|41|-50.00|0|0|022|R||
Я попытался выполнить приведенную ниже команду, и она сработала нормально, как и ожидалось
k=`awk '{print NF}' example.txt | sort -nr| sed -n '1p'`
for ((j=1;j<=2;j++)); do for((i=1;i<=$k;i++)); do awk -F "| -v i="$i" -v j="$j" 'NR==j{print $i}' example.txt| sed "s/^[+-]//g"| sed "s/^0\{2,\}//g"| sed "s/^\..*/0/g"; done| tr "\n" "|"| sed 's/|$//g'| sed 's/^|//g'; done| sed -r "s/\s+/|\n/g"| sed "s/^|//g"
выход
010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R||
010N00000001|20100115|20150115|PA|3|1|41|50.00|0|0|022|R||