0

A bash script yields the following output:

Computer_1 Netcom 1 Status_ok
Computer_1 Netcom 2 Status_ok
Computer_1 Netcom 3 Status_ok
Computer_1 Netcom 4 Status_ok
Computer_1 Netcom 5 Status_ok
Computer_1 Netcom 6 Status_ok
Computer_1 Netcom 7 Status_ok
Computer_1 Netcom 8 Status_ok
Computer_2 Netcom 9 Status_ok
Computer_2 Netcom 10 Status_ok
Computer_2 Netcom 11 Status_ok
Computer_2 Netcom 12 Status_ok
Computer_2 Netcom 13 Status_ok
Computer_2 Netcom 14 Status_ok
Computer_2 Netcom 15 Status_ok
Computer_2 Netcom 16 Status_ok
Computer_3 Netcom 17 Status_ok
Computer_3 Netcom 18 Status_ok
Computer_3 Netcom 19 Status_ok
Computer_3 Netcom 20 Status_ok
Computer_3 Netcom 21 Status_ok
Computer_3 Netcom 22 Status_ok
Computer_3 Netcom 23 Status_ok
Computer_3 Netcom 24 Status_ok
Computer_4 Netcom 25 Status_ok
Computer_4 Netcom 26 Status_ok
Computer_4 Netcom 27 Status_ok
Computer_4 Netcom 28 Status_ok
Computer_4 Netcom 29 Status_ok
Computer_4 Netcom 30 Status_ok
Computer_4 Netcom 31 Status_ok
Computer_4 Netcom 32 Status_ok

however, I need to batch-format the output group in four columns:

Computer_1          Computer_2          Computer_3          Computer_4
Netcom 1 Status_ok  Netcom 9 Status_ok  Netcom 17 Status_ok Netcom 25 Status_ok
Netcom 2 Status_ok  Netcom 10 Status_ok Netcom 18 Status_ok Netcom 26 Status_ok
Netcom 3 Status_ok  Netcom 11 Status_ok Netcom 19 Status_ok Netcom 27 Status_ok
Netcom 4 Status_ok  Netcom 12 Status_ok Netcom 20 Status_ok Netcom 28 Status_ok
Netcom 5 Status_ok  Netcom 13 Status_ok Netcom 21 Status_ok Netcom 29 Status_ok
Netcom 6 Status_ok  Netcom 14 Status_ok Netcom 22 Status_ok Netcom 30 Status_ok
Netcom 7 Status_ok  Netcom 15 Status_ok Netcom 23 Status_ok Netcom 31 Status_ok
Netcom 8 Status_ok  Netcom 16 Status_ok Netcom 24 Status_ok Netcom 32 Status_ok

What's a performant solution to achieve the following output?

2 Answers 2

2

pr can do the column-wise formatting. I use awk here to split off the column headers:

script.sh | 
awk '
    $1 != prev {print $1; prev=$1} 
    {for (i=2; i<=NF; i++) {$(i-1)=$i}; NF--; print}
' | 
pr -t4 -w84 |
expand

outputs

Computer_1           Computer_2           Computer_3           Computer_4
Netcom 1 Status_ok   Netcom 9 Status_ok   Netcom 17 Status_ok  Netcom 25 Status_ok
Netcom 2 Status_ok   Netcom 10 Status_ok  Netcom 18 Status_ok  Netcom 26 Status_ok
Netcom 3 Status_ok   Netcom 11 Status_ok  Netcom 19 Status_ok  Netcom 27 Status_ok
Netcom 4 Status_ok   Netcom 12 Status_ok  Netcom 20 Status_ok  Netcom 28 Status_ok
Netcom 5 Status_ok   Netcom 13 Status_ok  Netcom 21 Status_ok  Netcom 29 Status_ok
Netcom 6 Status_ok   Netcom 14 Status_ok  Netcom 22 Status_ok  Netcom 30 Status_ok
Netcom 7 Status_ok   Netcom 15 Status_ok  Netcom 23 Status_ok  Netcom 31 Status_ok
Netcom 8 Status_ok   Netcom 16 Status_ok  Netcom 24 Status_ok  Netcom 32 Status_ok
Sign up to request clarification or add additional context in comments.

Comments

0

This can probably be done a lottttt better but heres one way

Where $1 is the output from your bash script.

I use awk to remove the first field. Then iterate for the amount of lines and read every 8th line from the output. Then tanslate newlines into tabs so it looks neat.

Obviously if you have a changing number of records or rows or whatever you can just set them at the start of the script and replace my hardcoded numbers.

#!/bin/bash

echo -e "Computer_1\t\tComputer_2\t\tComputer_3\t\tComputer_4"
line=$(awk '{ print $2, $3, $4 }' $1)

for ((i = 1 ; i < 9 ; i++)); do

    linez=$(sed -n $i'~8p' <<< "$line")
    linez2=$(tr "\n" "\t" <<< "$linez")
    echo "$linez2"

done

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.