我在具有两列的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实用程序的组合是否可以完成此工作,以更少的代码完成此任务等。
答案 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