我有一个我们需要编辑的输出,所以我们可以删除重复的条目,它更像是一个树,我们有父设备及其子设备,每个孩子都有不止一个孩子
以下示例有关此内容的更多解释:
我需要编辑的输出如下:
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循环但是无法获得所需的东西
非常感谢您的帮助!
答案 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