有没有一种方法可以合并文本文件中相似(但不相同)的行?

时间:2018-10-11 17:36:01

标签: 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实用程序的组合是否可以完成此工作,以更少的代码完成此任务等。

3 个答案:

答案 0 :(得分:1)

使用awk

std::unique_ptr

输出:

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

答案 1 :(得分:1)

bash版本4,具有关联数组。

declare -A data
while read -r ip value; do
    data[$ip]+=":$value"
done < file

for key in "${!data[@]}"; do 
    printf "%s %s\n" "$key" "${data[$key]#:}"
done

答案 2 :(得分:0)

使用perl:

perl -lanE 'push @{$ips{$F[0]}}, $F[1]; END { $" = ":"; say "$_ @{$ips{$_}}" for sort keys %ips }' yourfile.txt

输出

140.90.218.62 vaac
140.90.220.11 aawu:afc:arh
140.90.220.40 afc