Я не знаю, работает ли эта команда по-прежнему в * BSD, но похоже, что в Linux она не работает более десяти лет. В наши дни arp_req_set_public () подключается к arp_req_set_proxy () , который запускает механизм ядра proxy_arp . Я так понимаю, что публикация ARP была задумана как средство реализации прокси-ARP, которое позже устарело благодаря более простой, менее подверженной авариям и более эффективной реализации.
Но обидно. Публикация ARP могла бы найти другое применение - например, удобный способ обработки выделенных пулов NAT. Если вам действительно нужна семантика, обещанная в руководстве по arp, вы можете попробовать демон ARP пользователя, например honeynet arpd (он же farpd) или choparpd .
awk с функцией sprintf (для добавления ведущих нулей):
awk -F, -v OFS=',' '$8=sprintf("MI-%02d",$8);' file
Вывод:
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-03
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-08
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,MI-12
-F,
- установить запятую ,
как разделитель полей
$ 8
- указывает на восьмое поле
% 02d
- формат, который обрабатывает аргумент функции как 2 -значное число
Примечание , последнее поле в записи может быть представлено как $ NF
.
NF - это предопределенная переменная, значением которой является количество полей в текущей записи
Итак, $ NF
совпадает с $ 8
(для вашего ввода )
awk -F, -v OFS=',' '$(NF)=sprintf("MI-%02d", $(NF))' file
С входными данными, такими как:
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,3
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,8
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,12
в text.csv
код ниже
awk -F"," '{ i = 0;
MyOutLine = "";
j = NF - 1;
while ( i < j ) {
i++;
MyOutLine = MyOutLine""$i",";
}
i++;
x = sprintf( "%.2i", $i );
y = "MI-"x;
MyOutLine = MyOutLine""y;
print MyOutLine; }' ./text.csv
производит вывод, например:
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-03
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-08
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,MI-12
Вот мое решение, выполненное с использованием Tcl, который читает из файла input.csv и помещает результат в файл output.csv
set in [open input.csv]
set out [open output.csv w]
while {![eof $in]} {
set line [gets $in]
set last_comma_pos [string last , $line]
puts $out [string range $line 0 $last_comma_pos][format MI-%02d [string range $line $last_comma_pos+1 end]]
}
close $in
close $out
Вы можете попробовать использовать awk
:
awk 'BEGIN { FS = OFS = "," } { $NF = sprintf("MI-%02d", $NF); } 1' file
Вот решение perl:
$ perl -F',' -lane '$last=$#F;$F[$last]=sprintf("MI-%02d",$F[$last]);print join ",", @F' input.txt
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-03
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-08
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,MI-12
Флаг -a
позволяет рассматривать входные данные как массив на основе разделителя, заданного с помощью -F
. По сути, мы изменяем последний элемент в этом массиве и перестраиваем его с помощью команды join
.