Linux:按具有相同值的列合并行

标签 linux bash file merge

有什么方法可以像这样合并行:

7072;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7079;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7091;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7113;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7128;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7159;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7168;understand;-;F;18;IT;MN;2009-03-18 00:00:00

变成一个:

7072;understand;-;F;18;IT;MN;2009-03-18 00:00:00

基本上,我需要:
1. 从第一列中获取在 2,n 列上具有相同值的数字 (ID) (7072, 7079,7091) 2. 删除重复项:只保留第一个 (7072) 还有其他条目,例如

7072;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7079;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7091;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7113;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7128;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7159;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7168;mistify;-;F;18;IT;MN;2009-03-18 00:00:00

我只需要离开 7072。 最后,似乎我必须获得这些数字并进行替换

sed 's/^id;.*//g' 

最佳答案

要根据第二列(即 understandmystify)删除重复项,您可以使用以下 awk 脚本来保留第一个副本行并过滤其他所有内容:

awk -F';' '!seen[$2]++' file

对于如下文件:

$ cat file
7072;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7079;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7091;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7113;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7128;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7159;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7168;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7072;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7079;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7091;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7113;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7128;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7159;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7168;mistify;-;F;18;IT;MN;2009-03-18 00:00:00

它将产生一个输出(只保留第一次出现并过滤其他所有内容)

$ awk -F';' '!seen[$2]++' file
7072;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7072;mistify;-;F;18;IT;MN;2009-03-18 00:00:00

我们创建一个数组 seen 并使用第二列作为键。当第一次看到该行时,它在我们数组中的计数为零,因此我们将其取反,使其值为 1 并默认打印它。所有后续时间该值都将大于 0,因此我们将其取反以使其变为 0 并对其进行过滤。

如果这不是您想要的,请更新您的问题以根据一些样本数据显示您想要的输出。

关于Linux:按具有相同值的列合并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23807092/

相关文章:

linux - 为什么 `timeout 2 timeout 1 bash`卡住了

c++ - C++中的头文件

c - Linux 描述符类型

linux - 如何记忆上一个 bash 命令的参数?

c++ - 我无法让我的程序工作我不断收到 undefined symbol : c

java - 列表迭代器卡住-Java

python - 在 Python 中读取文件的问题

linux - Zip 函数垃圾目录路径

linux - 如何在 bash 脚本中获取 cat 输出路径作为变量

linux - 如何在 shell 脚本中将目录附加到现有变量?