Rewriting GNU uniq in awk


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Rewriting GNU uniq in awk
# 1  
Old 10-23-2012
Rewriting GNU uniq in awk

Within a shell script I use

Code:
uniq -w 16 -D

in order to process all lines in which the first 16 characters are duplicated.

Now I want to also run that script on a BSD based system where the included version of uniq does not support the -w (--check-chars) option. To get around this I have written an awk script to instead use if GNU uniq is not available. It seems to work with both GNU and BSD versions of awk, but it is pretty ugly.

Code:
awk -v b=0 '{if (substr(a,0,16) == substr($0,0,16) || substr(b,0,16) == substr(a,0,16)) print a; b = a; a = $0} 
END{ if (substr(a,0,16) == substr(b,0,16)) print $0 }'

I am wondering if this can be simplified, or whether there is another, better solution.

Thanks.

Last edited by mij; 10-23-2012 at 10:56 AM.. Reason: Broke up line as stretching page.
# 2  
Old 10-23-2012
how about:
Code:
awk '{print substr($0,1,16) "\t" $0}' | uniq -D | cut -f2-

# 3  
Old 10-23-2012
Unfortunately uniq will still check the whole line for uniqueness. Also BSD uniq annoyingly does not include the -D (--all-repeated) switch either.
# 4  
Old 10-23-2012
Is the input data sorted?

This will work for both sorted and unsorted data (but uniq may produce a different output if the data is not sorted):

Code:
awk 'END {
  for (i = 0; ++i <= NR;)
    if (u[substr(d[i], 1, l)] > 1)
      print d[i]
  }
{ 
  u[substr($0, 1, l)]++
  d[NR] = $0
  }' l=16  infile

Your solution is more efficient though.

Tweaking your solution a little bit:

Code:
awk 'NR > 1 && (substr(a, 1, l) == substr($0, 1, l) || substr(b, 1, l) == substr(a, 1, l)) {
  print a
  }
{  b = a; a = $0 } 
END { 
  if (substr(a, 1, l) == substr(b, 1, l)) 
    print 
    }' l=16


Last edited by radoulov; 10-23-2012 at 11:53 AM..
# 5  
Old 10-23-2012
Quote:
Originally Posted by mij
Within a shell script I use

Code:
uniq -w 16 -D

in order to process all lines in which the first 16 characters are duplicated.
What does the data look like? Does it adhere to some format? Does it contain whitespace? Are certain characters guaranteed to appear? Are certain characters guaranteed to not appear? Knowing what we're dealing with might suggest alternative approaches.

Regards,
Alister
# 6  
Old 10-23-2012
Quote:
Originally Posted by radoulov
Is the input data sorted?
In my script I use sort before uniq so the data is sorted. I assume that would still be more efficient than having awk perform the sort itself?

Thanks.
# 7  
Old 10-23-2012
Quote:
Originally Posted by mij
In my script I use sort before uniq so the data is sorted. I assume that would still be more efficient than having awk perform the sort itself?
The script I provided doesn't sort the data at all (and it doesn't require the data to be sorted). It just prints the desired lines.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

awk or uniq

Hi Help, I have a file which looks like 1 20 30 40 50 60 6 2 20 30 40 50 60 8 7 20 30 40 50 60 7 4 30 40 50 60 70 8 5 30 40 50 60 70 9 2 30 40 50 60 70 8 I want the o/p as 1 20 30 40 50 60 6 4 30 40 50 60 70 8 Is there a way I can use uniq command or awk to do this? ... (11 Replies)
Discussion started by: Indra2011
11 Replies

2. Shell Programming and Scripting

awk compare and keep uniq

Hi all I was wondering if you may help me in resolving an issue. In particular I have a file like this: the ... represent different string and what I wrote Cur or Ent are the constant. Well, what I would like to obtain is a file in which are reported only the ID in which the second column... (6 Replies)
Discussion started by: giuliangiuseppe
6 Replies

3. Shell Programming and Scripting

Sort uniq or awk

Hi again, I have files with the following contents datetime,ip1,port1,ip2,port2,number How would I find out how many times ip1 field shows up a particular file? Then how would I find out how many time ip1 and port 2 shows up? Please mind the file may contain 100k lines. (8 Replies)
Discussion started by: LDHB2012
8 Replies

4. Shell Programming and Scripting

awk uniq and longest string of a column as index

I met a challenge to filter ~70 millions of sequence rows and I want using awk with conditions: 1) longest string of each pattern in column 2, ignore any sub-string, as the index; 2) all the unique patterns after 1); 3) print the whole row; input: 1 ABCDEFGHI longest_sequence1 2 ABCDEFGH... (12 Replies)
Discussion started by: yifangt
12 Replies

5. Shell Programming and Scripting

awk - getting uniq count on multiple col

Hi My file have 7 column, FIle is pipe delimed Col1|Col2|col3|Col4|col5|Col6|Col7 I want to find out uniq record count on col3, col4 and col2 ( same order) how can I achieve it. ex 1|3|A|V|C|1|1 1|3|A|V|C|1|1 1|4|A|V|C|1|1 Output should be FREQ|A|V|3|2 FREQ|A|V|4|1 Here... (5 Replies)
Discussion started by: sanranad
5 Replies

6. Shell Programming and Scripting

[uniq + awk?] How to remove duplicate blocks of lines in files?

Hello again, I am wanting to remove all duplicate blocks of XML code in a file. This is an example: input: <string-array name="threeItems"> <item>item1</item> <item>item2</item> <item>item3</item> </string-array> <string-array name="twoItems"> <item>item1</item> <item>item2</item>... (19 Replies)
Discussion started by: raidzero
19 Replies

7. Shell Programming and Scripting

Text Proccessing with sort,uniq,awk

Hello, I have a log file with the following input: X , ID , Date, Time, Y 01,01368,2010-12-02,09:07:00,Pass 01,01368,2010-12-02,10:54:00,Pass 01,01368,2010-12-02,13:07:04,Pass 01,01368,2010-12-02,18:54:01,Pass 01,01368,2010-12-03,09:02:00,Pass 01,01368,2010-12-03,13:53:00,Pass... (12 Replies)
Discussion started by: rollyah
12 Replies

8. Shell Programming and Scripting

Help with uniq or awk??

Hi, my dilemna is this: example i got a file of fruit.txt which contains: Apple 6 Apple_new 7 old_orange 9 orange 10 Is there any way for me to have an output of Apple 13 Orange 19 using shell script: (6 Replies)
Discussion started by: shinoman28
6 Replies

9. Shell Programming and Scripting

How to replicate data using Uniq or awk

Hi, I have this scenario; where there are two classes:- apple and orange. 1,2,3,4,5,6,apple 1,1,0,4,2,3,apple 1,3,3,3,3,4,apple 1,1,1,1,1,1,orange 1,2,3,1,1,1,orange Basically for apple, i have 3 entries in the file, and for orange, I have 2 entries. Im trying to edit the file and find... (5 Replies)
Discussion started by: ahjiefreak
5 Replies

10. Shell Programming and Scripting

using uniq and awk??

I have a file that is populated: hits/books.hits:143.217.64.204 Thu Sep 21 22:24:57 GMT 2006 hits/books.hits:62.145.39.14 Fri Sep 22 00:38:32 GMT 2006 hits/books.hits:81.140.86.170 Fri Sep 22 08:45:26 GMT 2006 hits/books.hits:81.140.86.170 Fri Sep 22 09:13:57 GMT... (13 Replies)
Discussion started by: amatuer_lee_3
13 Replies
Login or Register to Ask a Question