Изменение последних записей в списке с разделителями-запятыми

Я не знаю, работает ли эта команда по-прежнему в * BSD, но похоже, что в Linux она не работает более десяти лет. В наши дни arp_req_set_public () подключается к arp_req_set_proxy () , который запускает механизм ядра proxy_arp . Я так понимаю, что публикация ARP была задумана как средство реализации прокси-ARP, которое позже устарело благодаря более простой, менее подверженной авариям и более эффективной реализации.

Но обидно. Публикация ARP могла бы найти другое применение - например, удобный способ обработки выделенных пулов NAT. Если вам действительно нужна семантика, обещанная в руководстве по arp, вы можете попробовать демон ARP пользователя, например honeynet arpd (он же farpd) или choparpd .

8
13.03.2019, 00:00
5 ответов
Подход

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
14
27.01.2020, 20:08

С входными данными, такими как:

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
1
27.01.2020, 20:08

Tcl

Вот мое решение, выполненное с использованием 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

демонстрация

1
27.01.2020, 20:08

Вы можете попробовать использовать awk :

awk 'BEGIN { FS = OFS = "," } { $NF = sprintf("MI-%02d", $NF); } 1' file
3
27.01.2020, 20:08

Вот решение 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.

2
27.01.2020, 20:08

Теги

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