如果第一列在bash中相同,如何合并csv文件中的行

时间:2019-01-28 07:14:36

标签: awk control-m

我写了一个程序来查找给定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 :(得分:3)

请务必在代码标签中的问题中加倍努力。如果您不担心输出顺序,请尝试执行以下操作。

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

如果您需要以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

答案 1 :(得分:2)

另一个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
$

答案 2 :(得分:0)

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,对于找到的每一行,获取第二个字段并将其连接起来。