【发布时间】:2021-02-09 02:05:34
【问题描述】:
我有一个包含以下文本内容的文本文件,名为output.txt:
1.2.2.2 LOCAL_IP
LOCAL_IP 1.1.1.1
1.1.1.1 LOCAL_IP
233.233.233.233 LOCAL_IP
123.123.123.123 LOCAL_IP
233.233.233.233 LOCAL_IP
231.231.231.231 LOCAL_IP
123.123.123.123 LOCAL_IP
LOCAL_IP 123.111.23.2
LOCAL_IP 221.22.22.22
1.1.1.1 LOCAL_IP
LOCAL_IP 1.2.2.2
LOCAL_IP 123.123.123.123
2.2.2.2 LOCAL_IP
LOCAL_IP 3.3.21.2
LOCAL_IP 2.2.2.2
1.2.2.2 LOCAL_IP
LOCAL_IP 123.123.123.123
LOCAL_IP 123.111.23.2
1.1.1.1 LOCAL_IP
我想计算上面 IP 的总出现次数,不包括名为 LOCAL_IP 的文本字符串。例如,这是我的工作代码:
#!/bin/bash
output="output.txt"
a=$(awk '{ print $1 }' $output | grep -v 'LOCAL_IP' | sort | uniq -c | sed 's/^ *//' | sed -e "s/ /:/g")
b=$(awk '{ print $2 }' $output | grep -v 'LOCAL_IP' | sort | uniq -c | sed 's/^ *//' | sed -e "s/ /:/g")
echo "$a"
echo "-------"
echo "$b"
所以这是从上述脚本打印的输出(首先打印 a,然后是 b):
3:1.1.1.1
2:1.2.2.2
2:123.123.123.123
1:2.2.2.2
1:231.231.231.231
2:233.233.233.233
-------
1:1.1.1.1
1:1.2.2.2
2:123.111.23.2
2:123.123.123.123
1:221.22.22.22
1:2.2.2.2
1:3.3.21.2
有没有办法组合变量 a 和 b 的结果,然后重新计算/更新结果 a 和 b 的总数(在符号 : 之前)?那么结合了 a 和 b 的新变量 c 的结果将类似于:
echo "$c"
4:1.1.1.1 # added from a and b
3:1.2.2.2
2:123.111.23.2
4:123.123.123.123
1:221.22.22.22
2:2.2.2.2
1:3.3.21.2
1:231.231.231.231
2:233.233.233.233
我不确定是否需要为此开发算法。有人可以阐明一下,也许有一种更简单的方法可以实现这一点。
【问题讨论】:
-
所有答案都是关于在一个命令中完成所有操作。如果您真的想组合输出,您通常会在第二列 (
sort -t: -k2) 上对两个结果进行排序,然后对于每一行,如果第二个字段与先前读取的字段匹配,则添加到前一个第一个字段。否则打印前一个第一个字段。您需要处理停止条件(文件中的最后一行会发生什么情况)等,但它是一种用任何常用脚本语言编写的相当简单的算法。