скрипт для связывания столбцов - PullRequest
1 голос
/ 08 марта 2019

У меня есть файл, состоящий из определений, где имя переменной указывает на IP-адрес.Я хочу, чтобы скрипт (bash / python / аналогичный) выводил каждый IP-адрес, за которым следовал список каждой переменной, в которой он определен, а также количество переменных в списке.

Ввод:

define alpha    192.168.1.1
define beta     192.168.1.3
define gamma    192.168.1.2
define delta    192.168.1.1
define epsilon  192.168.1.3
define zeta     192.168.1.1
define eta      192.168.1.3
define theta    192.168.1.1

Вывод

192.168.1.1:alpha,delta,zeta,theta:4
192.168.1.3:beta,epsilon,eta:3
192.168.1.2:gamma:1

Использую ли я для этого ассоциативные массивы в bash или есть лучший способ?Я попытался сделать это, но закончил только bash-скриптом, который мне пришлось комбинировать с командами linux sort и uniq, но все равно не смог сделать это правильно.

Извиняюсь за дерьмовый заголовок, но яне могу сформулировать это лучше, так что не стесняйтесь редактировать.

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Использование awk:

awk '
  /^define/{
    a[$3]++
    b[$3]=(b[$3]?b[$3]",":"")$2
  }
  END {
    for(i in a)
      print i,b[i],a[i]
  }' OFS=: file

a - это массив, в котором хранится количество разных IP-адресов.
b - это массив, содержащий строку, содержащую все ключевые слова для каждого IP. Между каждым ключевым словом вставляется запятая.

В конце синтаксического анализа выводится индекс, содержащий IP-адрес и содержимое обоих массивов.

OFS=: устанавливает разделитель выходного поля на :.

0 голосов
/ 08 марта 2019

1-е решение: Не могли бы вы попробовать следующее.Это должно иметь возможность иметь эти значения, даже если у вас есть более 1 значения после ключевого слова define (1-е поле) и между последним полем (IP-адресом), хотя в вашем примере не более 3 полей, но я позаботился об этом(в случае, если ваш Input_file содержит более 3 полей).

awk '{$1="";val=$NF;$NF="";gsub(/^ +| +$/,"");a[val]=a[val]?a[val]","$0:$0;b[val]++}  END{for(i in a){print i":"a[i]":"b[i]}}' Input_file

ИЛИ добавление формы решения не с одним вкладышем здесь.

awk '
{
  $1=""
  val=$NF
  $NF=""
  gsub(/^ +| +$/,"")
  a[val]=a[val]?a[val]","$0:$0
  b[val]++
}
END{
  for(i in a){
      print i":"a[i]":"b[i]
  }
}'   Input_file


2-е решение: Приведенное выше 1-е решение НЕ даст тот же порядок IP-адресов (которые они присутствуют во входном файле), это решение позаботится о том, чтобы последовательность IP-адресов в выходных данных была одинаковойкак присутствие Input_file.

awk '{$1="";val=$NF;$NF="";gsub(/^ +| +$/,"")} !c[val]++{d[++count]=val} {a[val]=a[val]?a[val]","$0:$0;b[val]++}  END{for(i=1;i<=count;i++){print d[i]":"a[d[i]]":"b[d[i]]}}'  Input_file

ИЛИ (добавление формы не одного вкладыша вышеуказанного решения).

awk '
{
  $1=""
  val=$NF
  $NF=""
  gsub(/^ +| +$/,"")
}
!c[val]++{
  d[++count]=val
}
{
  a[val]=a[val]?a[val]","$0:$0
  b[val]++
}
END{
  for(i=1;i<=count;i++){
      print d[i]":"a[d[i]]":"b[d[i]]
  }
}'  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...