Today (Saturday) We will make some minor tuning adjustments to MySQL.

You may experience 2 up to 10 seconds "glitch time" when we restart MySQL. We expect to make these adjustments around 1AM Eastern Daylight Saving Time (EDT) US.


Print number of lines for files in directory, also print number of unique lines


Login or Register to Reply

 
Thread Tools Search this Thread
# 1  
Print number of lines for files in directory, also print number of unique lines

I have a directory of files, I can show the number of lines in each file and order them from lowest to highest with:

Code:
wc -l *|sort

15263 Image.txt
16401 reference.txt
40459 richtexteditor.txt

How can I also print the number of unique lines in each file?

Code:
15263 1401 Image.txt
16401 15999 reference.txt
40459 35670 richtexteditor.txt

If this is possible, how could I also sort it by unique vs overall count?
Moderator's Comments:
Mod Comment Please use CODE tags (not QUOTE tags) when displaying sample input, output, and code.

Last edited by Don Cragun; 6 Days Ago at 02:42 PM..
# 2  
how about this:
Code:
#!/bin/ksh

wc -l * | sed '$d' | sort | while read lines file junk
do
   echo $lines $(sort < $file | uniq -u |wc -l) $file
done

This User Gave Thanks to vgersh99 For This Post:
# 4  
Quote:
Originally Posted by nezabudka
Code:
awk '{u[$0]; l++} ENDFILE {print length(u), l, FILENAME; delete u; l=0}' * | sort -k1,1n

this is gawk specific AND it does not count the unique lines correctly.
How about another version:
Code:
gawk '{l[$0]++} ENDFILE {for (i in l) {if (l[i]==1) u++;t+=l[i]} print t, u, FILENAME; delete l; u=t=0}' *

Test files:
file1:
Code:
1
2
3
3
4
1

file2:
Code:
1
2
3
3
4
1
5

These 2 Users Gave Thanks to vgersh99 For This Post:
# 5  
Please always tell us what shell and operating system you're using when you start a new thread. Don't assume that everyone who wants to help you has read all of your previous threads.
Code:
#!/bin/bash
tmpf="/tmp/$$.result"

trap 'rm -f "$tmpf"' EXIT

awk '
function dump() {
	print linecount, distinct, lastfile
	linecount = distinct = 0
	split("", lines)
}

FILENAME != lastfile {
	if(lastfile)
		dump()
	lastfile = FILENAME
}

{	linecount++
	if(lines[$0]++ == 0)
		distinct++
}

END {	dump()
}' * > "$tmpf"

echo 'Sorted by increaasing number of lines in files:'
sort -n "$tmpf"

echo 'Sorted by increaasing number of distinct lines in files:'
sort -k2,2n "$tmpf"

Note that this should work with any version of awk (but on Solaris systems, you'll need to use nawk or /usr/xpg4/bin/awk).

Last edited by Don Cragun; 6 Days Ago at 03:57 PM.. Reason: Improve efficiency of awk script. Add note.
This User Gave Thanks to Don Cragun For This Post:
# 6  
Suggestion with regular awk:

Code:
awk '
FNR==1 {
  filenr++
  Name[filenr]=FILENAME
}

!Seen[filenr,$0]++ {
  Uniq[filenr]++
} 

{
  Total[filenr]++
} 

END {
  for(i in Name)
    print Total[i], Uniq[i], Name[i]
}
' file* | sort -nk1,1 -nk2,2 -k3,3


Last edited by Scrutinizer; 6 Days Ago at 06:15 PM..
This User Gave Thanks to Scrutinizer For This Post:
# 7  
Quote:
Originally Posted by vgersh99
how about this:
Code:
#!/bin/ksh

wc -l * | sed '$d' | sort | while read lines file junk
do
   echo $lines $(sort < $file | uniq -u |wc -l) $file
done

The following variant correctly handles filenames with special characters:
Code:
for f in *; do printf "%s/%s lines are unique in file %s\n" $(sort "$f" | uniq -u | wc -l) $(wc -l < "$f") "$f"; done

Post #3 has another perception of "unique":
Code:
for f in *; do printf "%s/%s unique lines in file %s\n" $(sort  -u "$f" | wc -l) $(wc -l < "$f") "$f"; done

Didn't see the "sort" requirement. Left as an exercise.

Last edited by MadeInGermany; 6 Days Ago at 03:51 PM..
These 2 Users Gave Thanks to MadeInGermany For This Post:
Login or Register to Reply

|
Thread Tools Search this Thread
Search this Thread:
Advanced Search

More UNIX and Linux Forum Topics You Might Find Helpful
How to print N number of lines before and after the grep?
Huvan
Hi , My record file , need to print up to above (DATA array)(there may be n no lines ) , grep "myvalue" row now .....suggest me some options --- DATA Array--- record type xxxxx sequence type yyyyy 2 3---> data1 /dev/ --- DEVICE --- MAXIMUM_People= data_blocks= MY_value=2 xyz abc ...... Shell Programming and Scripting
0
Shell Programming and Scripting
Writing a script to print the number of lines in multiple files
evelibertine
Hi I have 1000 files labelled data1.txt through data1000.txt. I want to write a script that prints out the number of lines in each txt file and outputs it in the following format: Column 1: number of data file (1 through 1000) Column 2: number of lines in the text file Thanks!... UNIX for Dummies Questions & Answers
2
UNIX for Dummies Questions & Answers
print every 20 lines the lowest number
TheTransporter
Hello all, How can I find the lowest number every 10 lines? For example i have a list name1 -0.1 name2 2 name3 3 name4 -3 name5 1 name6 2 name7 34 name8 34... Shell Programming and Scripting
6
Shell Programming and Scripting
Why? I can not change the number of lines to print
Edgar Guevara
hi My problem now is that if shipping options as -o length = 88 it says the following: # lp -o length=88 -dhp4015 /etc/hosts UX:lp: ERROR: The following options can't be handled: -o length= TO FIX: The printer(s) that otherwise qualify for printing your request can't handle one or more of...... SCO
2
SCO
How to print number of lines with awk ?
maheshsri
Can some body tell me how to print number of line from a particular file, with sed. ? Input file format AAAA BBBB CCCC SDFFF DDDD DDDD Command to print line 2 and 3 ? BBBB CCCC And also please tell me how to assign column sum to variable. I user the following command it...... Shell Programming and Scripting
1
Shell Programming and Scripting

Featured Tech Videos