Grep piramidale (non tanto grep) esame 2.7.2003
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