Difference between revisions of "Grep piramidale (non tanto grep) esame 2.7.2003"
Jump to navigation
Jump to search
(Created page with "=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 tu...") |
|||
Line 54: | Line 54: | ||
if __name__ == "__main__": | if __name__ == "__main__": | ||
main() | main() | ||
+ | </source> | ||
+ | |||
+ | Soluzione in bash | ||
+ | <source lang="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 | ||
</source> | </source> |
Latest revision as of 07:21, 22 April 2015
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