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

Awk 如果bash中的第一列相同,如何合并csv文件中的行,awk,control-m,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 } 但是我不知道如何从这里继续前进。请务必在代码标签中的问题中添加您的努力。如果您不担心输出的

我已经编写了一个程序来查找给定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 }

但是我不知道如何从这里继续前进。

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

awk 'BEGIN{FS=OFS=","} {a[$1]=($1 in a ? a[$1] OFS : "") $2} END{for(i in a){print i,a[i]}}'  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
若您需要以输入文件的第一个字段出现的相同顺序获得输出,请尝试以下操作

awk 'BEGIN{FS=OFS=","} {a[$1]=($1 in a ? a[$1] OFS : "") $2} END{for(i in a){print i,a[i]}}'  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

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

awk 'BEGIN{FS=OFS=","} {a[$1]=($1 in a ? a[$1] OFS : "") $2} END{for(i in a){print i,a[i]}}'  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
若您需要以输入文件的第一个字段出现的相同顺序获得输出,请尝试以下操作

awk 'BEGIN{FS=OFS=","} {a[$1]=($1 in a ? a[$1] OFS : "") $2} END{for(i in a){print i,a[i]}}'  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
又一个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
$
又一个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
$
假设: 您的文件以逗号分隔,格式与上面显示的格式相同

解释FWIW: 首先找到唯一的IP标识符,然后在文件中找到该字符串的grep,对于找到的每一行,获取第二个字段并连接它们

假设: 您的文件以逗号分隔,格式与上面显示的格式相同

解释FWIW:
首先查找唯一的IP标识符,然后在文件中查找该字符串的grep,对于找到的每一行,获取第二个字段并将它们连接起来。

我的主代码是python,我正在修改python代码,以便以这种格式打印输出。但是,对于我已有的输出文件,我只想将它们转换成那种格式,这样我就不必运行扫描again@AnujKulkarni,我们都在这里学习,因此建议您在您的帖子中添加您的努力,请这样做并让我们知道。@RavinderSingh13好的,我有一个不完整的代码,因为我对awk不是很流利,我会尽力编辑我的问题。我的主代码是python,我正在修改python代码以这种格式打印输出。但是对于我已经有的输出文件,我只想将它们转换成那种格式,所以我不必运行扫描again@AnujKulkarni,我们都在这里学习,建议您在您的帖子中添加您的努力,请这样做并让我们知道。@RavinderSingh13好的,我有一个不完整的代码,因为我对awk不是很流利,我将尽力编辑我的问题。此打印输出为ip1,端口1\n,端口2\n,端口3\n而不是在一个端口中打印它row@AnujKulkarni,请检查您的输入文件是否通过执行cat-v输入文件来控制M。如果是,请通过执行tr-d'\r'temp&&mv temp Input\u file来移除它们。谢谢。我的输入文件具有控制M。使用您给定的代码更正它。你能解释一下为什么要引入控制M字符吗?thanks@AnujKulkarni,当我们将某些内容从windows复制到unix时,它们通常会出现。这会将输出打印为ip1、port1\n、port2\n、port3\n,而不是一次打印row@AnujKulkarni,请检查您的输入文件是否通过使用cat-v输入文件来控制M。如果是,请通过使用tr-d'\r'temp&&mv temp Input\u文件来移除它们。谢谢。我的输入文件具有控制M。使用您给定的代码更正了它。你能解释一下为什么要引入控制M字符吗?thanks@AnujKulkarni,当我们将某些东西从windows复制到unix时,它们通常会出现。