РАЗДЕЛЕНИЕ ПОРТОВ РЯДОВ В НОВОЙ ЛИНИИ С IP - PullRequest
1 голос
/ 22 апреля 2020

HI Мне нужна помощь, поэтому у меня есть файл со следующей информацией:

IP,Ports,count
"192.168.0.1","80 8980 6789 443 4778 3556 7778 4432 5674 7786 2234 6678 33245 7788 3332 6678 3322 5432 5567",19
"192.168.0.2","80 8980 6789 443 4778 3556 7778 4432 5674 7786 2234 6678 33245 7788 3332 6678 3322 5432 5567",19
"192.168.0.3","80 8980 6789 443 4778 3556 7778 4432 5674 7786 2234 6678 33245 7788 3332 6678 3322 5432 5567",19
"192.168.0.4","80 8980 6789 443 4778 3556 7778 4432 5674 7786 2234 6678 33245 7788 3332 6678 3322 5432 5567",19

Я хочу разделить порты на диапазон, равный 5, для каждого файла в новом файле с его IP.

Ожидаемые результаты.

IP,Ports
192.168.0.1 80,8980,6789,443,4778
192.168.0.1 3556,7778,4432,5674,7786
192.168.0.1 2234,6678,33245,7788,3332
192.168.0.1 6678,3322,5432,5067
192.168.0.2 80,8980,6789,443,4778
192.168.0.2 3556,7778,4432,5674,7786
192.168.0.2 2234,6678,33245,7788,3332
192.168.0.2 6678,3322,5432,5067
192.168.0.3 80,8980,6789,443,4778
192.168.0.3 3556,7778,4432,5674,7786
192.168.0.3 2234,6678,33245,7788,3332
192.168.0.3 6678,3322,5432,5067
192.168.0.4 80,8980,6789,443,4778
192.168.0.4 3556,7778,4432,5674,7786
192.168.0.4 2234,6678,33245,7788,3332
192.168.0.4 6678,3322,5432,5067

Если честно, я понятия не имею, как это сделать или с чего начать. Пожалуйста, помогите.

Либо в AWK, либо python любой может сделать, просто объясните мне, что делает скрипт / однострочник, чтобы я мог попробовать поиграть с ним.

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Не могли бы вы попробовать следующее (проверено и написано в показанных образцах).

awk -F'"|","' -v lines=$(wc -l < Input_file) '
BEGIN{
  print "IP,ports"
}
FNR>1{
  num=split($3,array," ")
  for(i=1;i<=num;i++){
    if(i==1){ printf $2 OFS }
    printf("%s%s",array[i],i%5==0||i==num?ORS:FNR==lines && i==num?ORS:",")
    if(i%5==0){ printf $2 OFS }
  }
}' Input_file

Объяснение: Добавление подробного объяснения выше здесь.

awk -F'"|","' -v lines=$(wc -l < Input_file) '                                  ##Starting awk program from here.
BEGIN{                                                                          ##Starting BEGIN section of this program.
  print "IP,ports"                                                              ##Printing headers here.
}
FNR>1{                                                                          ##Checking condition if current line number is greater than 1st line.
  num=split($3,array," ")                                                       ##Splitting 3rd field into an array with delimiter space.
  for(i=1;i<=num;i++){                                                          ##Traversing through all elements of array here.
    if(i==1){ printf $2 OFS }                                                   ##if its first element of array then print 2nd field of line and OFS.
    printf("%s%s",array[i],i%5==0||i==num?ORS:FNR==lines && i==num?ORS:",")     ##Printing array value along with condition if its 5 element or number of total elements equals i then print new line OR current line number equal to lines OR i equals to num then print new line OR print comma.
    if(i%5==0){ printf $2 OFS }                                                 ##If its 5th element then print current line 2nd field with space
  }
}' Input_file                                                                   ##mentioning Input_file name here.
2 голосов
/ 22 апреля 2020

Для Python вы можете сделать следующее:

  • Считать файл CSV с помощью csv.DictReader и открыть файл для записи с помощью DictReader. DictReader сопоставляет каждую строку с dict, что облегчает доступ к столбцам CSV.
  • Запись выходных CSV-заголовков с помощью DictWriter.writeheader.
  • Повторение каждой строки файла с помощью for l oop.
  • Split порты в пустом пространстве, используя str.split.
  • Блок каждые 5 портов. Мы можем использовать метод из Как разбить список на куски одинакового размера? .
  • Go через каждый из этих кусков, затем запишите новую строку, используя csvwriter.writerow. Мы обязательно включаем только столбцы IP и Ports.

Демонстрация:

output.csv

IP,Ports
192.168.0.1,"80,8980,6789,443,4778"
192.168.0.1,"3556,7778,4432,5674,7786"
192.168.0.1,"2234,6678,33245,7788,3332"
192.168.0.1,"6678,3322,5432,5567"
192.168.0.2,"80,8980,6789,443,4778"
192.168.0.2,"3556,7778,4432,5674,7786"
192.168.0.2,"2234,6678,33245,7788,3332"
192.168.0.2,"6678,3322,5432,5567"
192.168.0.3,"80,8980,6789,443,4778"
192.168.0.3,"3556,7778,4432,5674,7786"
192.168.0.3,"2234,6678,33245,7788,3332"
192.168.0.3,"6678,3322,5432,5567"
192.168.0.4,"80,8980,6789,443,4778"
192.168.0.4,"3556,7778,4432,5674,7786"
192.168.0.4,"2234,6678,33245,7788,3332"
192.168.0.4,"6678,3322,5432,5567"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...