【问题标题】:how to merge rows ina csv file if if the first column is same in bash如果bash中的第一列相同,如何合并csv文件中的行
【发布时间】:2023-03-13 06:46:02
【问题描述】:

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

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

【问题讨论】:

  • 我的主要代码在 python 中,我正在更改 python 代码以打印这种格式的输出。但是在我已经拥有的输出文件上,我只想将它们转换为那种格式,所以我不必再次运行扫描
  • @AnujKulkarni,我们始终建议您在帖子中添加您的努力,因为我们都在这里学习,请这样做并让我们知道。
  • @RavinderSingh13 好的,我的代码不完整,因为我不太熟悉 awk,我会努力编辑我的问题

标签: awk control-m


【解决方案1】:

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

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 发现在 Input_file(s) 中也发现了 control-m 字符,所以添加以下内容:

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

【讨论】:

  • 这会将输出打印为 ip1,port1\n,port2\n,port3\n 而不是在一行中打印
  • @AnujKulkarni,您能否通过 cat -v Input_file 检查您的 Input_file 是否具有控制 M,如果是,请通过 tr -d '\r' &lt; Input_file &gt; temp &amp;&amp; mv temp Input_file 删除它们。
  • 谢谢。我的输入文件有控制 M。用你给定的代码更正了它。您能否解释一下为什么要引入控制 M 字符?谢谢
  • @AnujKulkarni,当我们将某些东西从 windows 复制到 unix 时,它们通常会出现。
【解决方案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
$

【讨论】:

    【解决方案3】:
    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 查找该字符串,为找到的每一行获取第二个字段并将它们连接起来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      • 2017-01-08
      相关资源
      最近更新 更多