как объединить строки в CSV-файле, если первый столбец в Bash то же самое - PullRequest
0 голосов
/ 28 января 2019

Я написал программу для поиска открытых портов данного IP.Поскольку функция печати находится в цикле, мой формат вывода выглядит следующим образом:

IP1,22
IP1,23
IP1,24
IP2,25
IP2,26
IP3,27
IP3,30
IP3,45

Как мне получить его в этом формате:

IP1,22,23,24
IP2,25,26
IP3,27,30,45

РЕДАКТИРОВАТЬ: это то, что я сделалдо сих пор

awk'{a[$1]=(a[$1])? a[$1]r : r }

но я не знаю, как двигаться дальше отсюда.

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Еще один awk ..

$ cat anuj.txt
IP1,22
IP1,23
IP1,24
IP2,25
IP2,26
IP3,27
IP3,30
IP3,45
$ awk -F, ' { c=$1; if(c!=p) { printf("\n%s,%d",$1,$2)} else { printf(",%d",$2) } p=c } END { print ""} ' anuj.txt

IP1,22,23,24
IP2,25,26
IP3,27,30,45
$

В приведенном выше решении есть пустая строка.Чтобы избавиться от него, вы можете использовать ниже

$ awk -F, ' { c=$1; if(c!=p) { printf("%s%s,%d",sep,$1,$2)} else { printf(",%d",$2) } p=c;sep="\n" } END { print ""} ' anuj.txt
IP1,22,23,24
IP2,25,26
IP3,27,30,45
$
0 голосов
/ 22 марта 2019
sort anuj.txt | cut -d, -f1 | sort -u  | while read line; do echo $line,$(grep $line anuj.txt | cut -d, -f2 | paste -sd, -); done

Допущения: ваш файл разделен запятыми и имеет тот же формат, который вы показывали выше.

Объяснение (FWIW): Сначала найдите уникальные идентификаторы IP, затем grep для этой строки в файле, длякаждая найденная строка получает второе поле и объединяет их.

0 голосов
/ 28 января 2019

Пожалуйста, всегда добавляйте свои усилия в своем вопросе в тегах кода.Если вас не беспокоит порядок вывода, попробуйте выполнить следующее.

awk 'BEGIN{FS=OFS=","} {a[$1]=($1 in a ? a[$1] OFS : "") $2} END{for(i in a){print i,a[i]}}'  Input_file

Если вам нужно получить вывод в том же порядке, в котором идет 1-е поле Input_file, попробуйте выполнить следующее.

awk '
BEGIN{
  FS=OFS=","
}
!b[$1]++{
  c[++count]=$1
}
{
  a[$1]=($1 in a ? a[$1] OFS : "") $2
}
END{
  for(i=1;i<=count;i++){
    print c[i],a[c[i]]
  }
}'  Input_file

Поскольку позднее OP обнаружил, что символы control-m были найдены и во входных файлах, добавьте следующее:

tr -d '\r' < Input_file > temp && mv temp Input_file
...