merging uniq -c lists
Giorgos Keramidas
keramida at ceid.upatras.gr
Thu Dec 27 15:00:39 EET 2007
On 2007-12-27 10:51, Nick Demou <ndemou at gmail.com> wrote:
> υπάρχει standard unix tool για να κάνω merge δύο λίστες που έχουν
> προκύψει από uniq -c ?
>
> π.χ. αν έχω αυτά τα δύο text αρχεία
> # cat list1
> 100 φοο
> 200 λα
> 300 τσιου
> # cat list2
> 20 φοο
> 30 λα
> 50 koko
>
> να μπορώ με μια εντολή να πάρω αυτό:
> 50 koko
> 120 φοο
> 230 λα
> 300 τσιου
Οχι κάποιο έτοιμο, αλλά είναι ιδιαίτερα εύκολο σε Python, που φαίνεται
να την συμπαθείς αρκετά. Προσπάθησα να γράψω το script έτσι ώστε να διατηρεί
το 'formatting' των input lines, οπότε αν οι input γραμμές έχουν literal TAB
χαρακτήρες, όλη η γραμμή μετά το μετρητή της uniq θεωρείται 'key':
% keramida at kobe:/tmp/ndemou$ cat foo
% 4 a demo line
% 2 b
% keramida at kobe:/tmp/ndemou$ cat bar
% 4 baz
% 3 b
% keramida at kobe:/tmp/ndemou$ ./usum.py foo bar
% 4 a demo line
% 5 b
% 4 baz
% keramida at kobe:/tmp/ndemou$ cat foo bar | ./usum.py
% 4 a demo line
% 5 b
% 4 baz
% keramida at kobe:/tmp/ndemou$
και το ίδιο το script ...
% #!/usr/bin/env python
%
% """Sum lists of uniq(1) output, either fed through out stdin, or passed as
% filename arguments in our command-line."""
%
% import errno
% import os
% import re
% import sys
%
% # Save the invocation name of the script, for later use.
% progname = os.path.basename(sys.argv[0])
%
% # Set up some handy aliases for functions of other modules.
% write = sys.stdout.write
% err = sys.stderr.write
% exit = sys.exit
%
% # Prepare a precompiled regexp to match uniq(1) fields.
% try:
% ure = re.compile('^\s*(\d+)\s+(.*)$')
% except Exception, inst:
% err("%s: internal regexp error\n" % progname)
% exit(1)
%
% def dispatch(uniq, fp):
% lineno = 0
% for l in fp.readlines(8192):
% lineno += 1
% match = ure.match(l)
% if not match:
% err("%s: %s: line %d: ignoring line (not enough fields)\n" % \
% (progname, fname, lineno))
% continue
% (count, tag) = match.groups()
% count = int(count)
% try:
% count += int(uniq[tag])
% except KeyError:
% pass
% uniq[tag] = int(count)
% return None
%
% if __name__ == "__main__":
% uniq = {}
%
% if len(sys.argv) == 1:
% dispatch(uniq, sys.stdin)
% else:
% for fname in sys.argv[1:]:
% try:
% dispatch(uniq, file(fname))
% except IOError, inst:
% if inst.errno == errno.ENOENT:
% err("%s\n" % str(inst))
% continue
%
% for item in uniq.keys():
% count = int(uniq[item])
% write("%4d %s\n" % (count, item))
Μαίρη Κρίστμας :-P
More information about the Linux-greek-users
mailing list