我有 1 个文件中的数据
例子:
a1b1:online
xxxx:offline
wxyz:enable
a2b2:online
txtx:disable
对于单一数据,不是问题,但是对于在线双信息怎么样?
我如何显示类似的信息
data a1b1 a2b2 are online --- how to get this
data xxxx are offline -- no issue
data wxyz are enable -- no issue
答案1
$ awk -F: 'a[$2] {a[$2] = a[$2]" "$1; next};
{a[$2]=$1};
END {for (s in a) { print "data " a[s] " are " s }}' input.txt
data xxxx are offline
data txtx are disable
data a1b1 a2b2 are online
data wxyz are enable
这使用关联数组a
(以状态 $2 作为键)来存储具有该状态的主机 ($1)。如果给定状态的数组元素已存在,则在其中附加一个空格和主机名。否则,只需使用该主机名创建该元素。
(我假设它们是主机名 - 没关系。代码适用于数据而不是定义)
读取整个输入文件后,它会以所需的格式打印出数组。
请注意,由于关联数组 inawk
不以任何特定顺序存储,因此输出是无序的。如果需要对其进行排序,可以在 awk 脚本中执行此操作,但将输出通过管道传输到sort
.
如果您只对状态感兴趣online
,可以将输出通过管道传输到grep
,或者在 awk 脚本中执行。例如
$ awk -F: '!/online/ {next};
a[$2] {a[$2] = a[$2]" "$1; next};
{a[$2]=$1};
END {for (s in a) { print "data " a[s] " are " s }}' input.txt
data a1b1 a2b2 are online
答案2
命令
for i in `awk -F ":" '{print $NF}' filename | sed '/^$/d'| awk '{if(!seen[$NF]++)print }'`; do awk -v i="$i" -F ":" '$NF == i{print $1}' filename |sed "N;s/\n/ /g"| awk -v i="$i" '{print "data" " " $0" " "are "i}'; done
输出
data a1b1 a2b2 are online
data xxxx are offline
data wxyz are enable
data txtx are disable