简体   繁体   中英

How to sort output data into columns and rows

I have an output that looks like this, where the first number corresponds to the count of the type below (eg 72 for Type 4, etc)

 72
 Type
 4
 51
 Type
 5
 66
 Type
 6
 78
 Type
 7
 ..etc

Is there a way to organize this data to look something like this:

 Type 4 = 72 times
 Type 5 = 51 times
 Type 6 = 66 times 
 etc.. 

Essentially, the question is how to take a single column of data and sort /organize it into something more readable using bash, awk, python, etc. (Ideally, in bash, but interested to know how to do in Python).

Thank you.

使用paste从stdin连接3条连续的线,然后重新排列字段。

paste - - - < file | awk '{print $2, $3, "=", $1, "times"}'

It's simple enough with Python to read three lines of data at a time:

def perthree(iterable):
    return zip(*[iter(iterable)] * 3)

with open(inputfile) as infile:
    for count, type_, type_num in perthree(infile):
        print('{} {} = {} times'.format(type_.strip(), type_num.strip(), count.strip()))

The .strip() calls remove any extra whitespace, including the newline at the end of each line of input text.

Demo:

>>> with open(inputfile) as infile:
...     for count, type_, type_num in perthree(infile):
...         print('{} {} = {} times'.format(type_.strip(), type_num.strip(), count.strip()))
... 
Type 4 = 72 times
Type 5 = 51 times
Type 6 = 66 times
Type 7 = 78 times

Try this awk one liner:

$ awk 'NR%3==1{n=$1}NR%3==2{t=$1}NR%3==0{print t,$1,"=",n,"times"}' file
Type 4 = 72 times
Type 5 = 51 times
Type 6 = 66 times
Type 7 = 78 times

How it works?

awk '
    NR%3==1{ # if we are on lines 1,4,7, etc (NR is the record number (or the line number)
        n=$1 # set the variable n to the first (and only) word
    }
    NR%3==2{ # if we are on lines 2,5,7, etc 
        t=$1 # set the variable t to the first (and only) word
    }
    NR%3==0{ # if we are on lines 3,6,9, etc
        print t,$1,"=",n,"times" # print the desired output 
    }' file

In Bash:

#!/bin/bash
A=() I=0
while read -r LINE; do
    if (( (M = ++I % 3) )); then
        A[M]=$LINE
    else
        printf "%s %s = %s times\n" "${A[2]}" "$LINE" "${A[1]}"
    fi
done

Running bash script.sh < file creates:

Type 4 = 72 times
Type 5 = 51 times
Type 6 = 66 times
Type 7 = 78 times

Note: With a default IFS ( $' \\t\\n' ), read would remove leading and trailing spaces by default.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM