在 Linux 中操作数据

在 Linux 中操作数据

我有 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

相关内容