删除重复的字符串并像树一样显示?

时间:2017-02-28 10:22:15

标签: bash filter

我有一个我们需要编辑的输出,所以我们可以删除重复的条目,它更像是一个树,我们有父设备及其子设备,每个孩子都有不止一个孩子

以下示例有关此内容的更多解释:

我需要编辑的输出如下:

X1  Y6  ID=0
X1  Y6  ID=1
X1  Y7  ID=0
X1  Y8  ID=0

X2  Y6  ID=0
X2  Y6  ID=1
X2  Y7  ID=0

X3  Y6  ID=0
X3  Y6  ID=1

=============

所需的输出应为:

X1  Y6  ID=0
        ID=1
    Y7  ID=0
    Y8  ID=0

X2  Y6  ID=0
        ID=1
    Y7  ID=0

X3  Y6  ID=0
        ID=1

所以,我们有例如X1有3个孩子Y6,Y7和Y8而Y6有2个ID而Y7,Y8只有一个ID = 0

所需的输出可能不同但我们仍然需要了解X1每个Y有三个Y和ID

我用awk和greps尝试了很多for循环但是无法获得所需的东西

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用此awk脚本:

awk -v OFS="  " '
{
   for(i=1;i<=NF;i++) {       # Loop through all fields
      if(last[i]==$i && i<3)  # Check if field is different than previous line
         gsub(/./," ",$i)     # Replace all character by spaces
      printf $i OFS           # Print the field with the separator
      if($i !~ / +/)          # Check if the field contains only spaces
         last[i]=$i           # Store the last field
   }
   printf ORS                 # No more fields, print the new line
}' file

答案 1 :(得分:0)

诀窍是记住前一行的不同字段。你应该使用awk来获得更好的性能,在这里你可以找到一个详细的原型。

cmd_generating_output | while read -r x y i; do
   # check for empty line, can be skipped
   if [ -z "i$x" ]; then
      echo
   else
      if [ "$x" = "${lastx}" ]; then
         newx=" "
         if [ "$y" = "${lasty}" ]; then
            newy=" "
         else
            newy="$y"
         fi
      else
         newx="$x"
         newy="$y"
      fi
      printf "%-4s%-4s%s\n" "${newx}" "${newy}" "$i"
      lastx=$x
      lasty=$y
   fi
done