如果 bash 中的第一列相同,如何合并 csv 文件中的行
how to merge rows ina csv file if if the first column is same in bash
我编写了一个程序来查找给定 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[]=(a[])? a[]r : r }
但我不知道如何从这里前进。
请始终在代码标记的问题中添加您的努力。如果您不担心输出顺序,请尝试以下操作。
awk 'BEGIN{FS=OFS=","} {a[]=( in a ? a[] OFS : "") } END{for(i in a){print i,a[i]}}' Input_file
如果您需要以与 Input_file 的第一个字段相同的顺序获得输出,请尝试以下操作。
awk '
BEGIN{
FS=OFS=","
}
!b[]++{
c[++count]=
}
{
a[]=( in a ? a[] OFS : "")
}
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
另一个 awk..
$ cat anuj.txt
IP1,22
IP1,23
IP1,24
IP2,25
IP2,26
IP3,27
IP3,30
IP3,45
$ awk -F, ' { c=; if(c!=p) { printf("\n%s,%d",,)} else { printf(",%d",) } p=c } END { print ""} ' anuj.txt
IP1,22,23,24
IP2,25,26
IP3,27,30,45
$
上述解决方案中有一个空行。要摆脱它,您可以使用下面的
$ awk -F, ' { c=; if(c!=p) { printf("%s%s,%d",sep,,)} else { printf(",%d",) } p=c;sep="\n" } END { print ""} ' anuj.txt
IP1,22,23,24
IP2,25,26
IP3,27,30,45
$
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 标识符,然后在文件中查找该字符串,对于找到的每一行获取第二个字段并将它们连接起来。
我编写了一个程序来查找给定 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[]=(a[])? a[]r : r }
但我不知道如何从这里前进。
请始终在代码标记的问题中添加您的努力。如果您不担心输出顺序,请尝试以下操作。
awk 'BEGIN{FS=OFS=","} {a[]=( in a ? a[] OFS : "") } END{for(i in a){print i,a[i]}}' Input_file
如果您需要以与 Input_file 的第一个字段相同的顺序获得输出,请尝试以下操作。
awk '
BEGIN{
FS=OFS=","
}
!b[]++{
c[++count]=
}
{
a[]=( in a ? a[] OFS : "")
}
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
另一个 awk..
$ cat anuj.txt
IP1,22
IP1,23
IP1,24
IP2,25
IP2,26
IP3,27
IP3,30
IP3,45
$ awk -F, ' { c=; if(c!=p) { printf("\n%s,%d",,)} else { printf(",%d",) } p=c } END { print ""} ' anuj.txt
IP1,22,23,24
IP2,25,26
IP3,27,30,45
$
上述解决方案中有一个空行。要摆脱它,您可以使用下面的
$ awk -F, ' { c=; if(c!=p) { printf("%s%s,%d",sep,,)} else { printf(",%d",) } p=c;sep="\n" } END { print ""} ' anuj.txt
IP1,22,23,24
IP2,25,26
IP3,27,30,45
$
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 标识符,然后在文件中查找该字符串,对于找到的每一行获取第二个字段并将它们连接起来。