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