linux - 有没有办法合并文本文件中相似(但不相同)的行?

标签 linux bash awk

我在 Linux 机器上有一个文本文件,有两列。 1.IP地址 2. 位置代码

某些 IP 地址会多次列出,因为有多个代码与其关联。

示例:

140.90.218.62 vaac
140.90.220.11 aawu
140.90.220.11 afc
140.90.220.11 arh
140.90.220.40 afc

我想将此类 IP 地址合并为仅列出一次,仅包含多个位置代码

像这样

140.90.218.62 vaac
140.90.220.11 aawu:afc:arh
140.90.220.40 afc

我总是可以编写一个 for 循环来读入文件,将值合并到一个数组中,然后将清理后的版本写回。

在这样做之前,我想知道 *nix 实用程序的组合是否可以完成这项工作,用更少的代码来完成,等等。

最佳答案

使用awk

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

输出:

140.90.220.11 aawu:afc:arh
140.90.220.40 afc
140.90.218.62 vaac

说明:

  • a[$1]=($1 in a?a[$1]":"$2:$2) - 创建一个以 IP 地址为键的索引数组。如果已有值,则具有相同 IP 的每个 $2 都会连接到当前值,并用冒号分隔。
  • for (i in a) print i,a[i] - 当 stdin 关闭时,打印 a 中的所有条目,首先是索引 (IP),然后是所有值。

关于linux - 有没有办法合并文本文件中相似(但不相同)的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52765964/

相关文章:

c - 如何在属于同一父进程的两个子进程之间共享内存

linux - 从发送邮件邮件队列中删除邮件

从 gcc 的中间文件编译目标文件

bash 函数返回 "command not found"

bash - bash 中的 </dev/null 是什么?

linux - ptrace 防止信号在跟踪进程中中断 pselect()

bash 仅整数

bash - awk 以时间格式打印出最小和最大数字

arrays - 在 Awk 中使用多个数组而不重复代码

linux - 如何对文件进行子集化 - 选择多个行或列