我在 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/