Grep piramidale (non tanto grep) esame 2.7.2003

From Sistemi Operativi
Jump to navigation Jump to search

Traccia

Scrivere uno script che prende in input (da linea di comando) una stringa e una lista di file; lo script deve riportare il numero di occorrenze della stringa e di tutte i suoi prefissi nei file specificati. Ad esempio, se la stringa cercata è linux, lo script deve riportare un output del tipo:

l 512
li 324
lin 300
linu 30
linux 30

Soluzione di Eddy

In bash sarebbe stato molto piu` corto, ma volevo provare a fare qualcosa in python.

#!/usr/bin/env python3
import argparse
import os
import sys

def main():
    # parsing degli argomenti
    parser = argparse.ArgumentParser()
    parser.add_argument("string", help="string to be matched")
    parser.add_argument("files", nargs='+', help="source files")
    args = parser.parse_args()

    # leggo tutti i file e metto le parole in data
    data = list()
    try:
        for fname in args.files:
            with open(fname) as f:
                data += f.read().split()
    except FileNotFoundError:
        print ('file \'%s\' not found' % fname)
        sys.exit(0)

    # faccio lo string matching per ogni prefisso
    for i in range(len(args.string)+1)[1:]:     # ogni prefisso
        currStrn = args.string[:i]
        count = 0
        newData = list()

        for strn in data:       # string matching
            n = strn.count(currStrn)
            if n>0:
                count += n
                newData.append(strn)
        print (currStrn,count)
        data = newData


if __name__ == "__main__":
    main()

Soluzione in bash

#!/usr/bin/env bash

cat ${@:2} >> /tmp/tmp$$
string=$1
for (( i=1; i<=${#string}; i++ ))
do
   curr=$(echo ${string} | cut -c1-$i)
   occ=$(grep -o "$curr" /tmp/tmp$$ | wc -w)
   echo "$curr $occ"
done