deconstruct
deconstruct

Reputation: 41

Print 1 Occurence for Each Pattern Match

I have a file that contains a pattern at the beginning of each newline:

./bob/some/text/path/index.html
./bob/some/other/path/index.html
./bob/some/text/path/index1.html
./sue/some/text/path/index.html
./sue/some/text/path/index2.html
./sue/some/other/path/index.html
./john/some/text/path/index.html
./john/some/other/path/index.html
./john/some/more/text/index1.html
... etc.

I came up with the following code to match the ./{name}/ pattern and would like to print 1 occurance of each name, BUT, it either prints out every line matching that pattern, or just 1 and stops when using the -m 1 flag:

I've tried it as a simple grep line(below) and also put it in a for loop

name=$(grep -iEoha -m 1 '\.\/([^/]*)\/' ./without_localnamespace.txt)

echo $name

My expected reuslts are:

./bob/
./sue/
./john/

Actual Results are:
./bob/

Upvotes: 0

Views: 46

Answers (3)

Walter A
Walter A

Reputation: 20032

You can do

cut -d "/" -f2  ./without_localnamespace.txt | sort -u

Upvotes: 1

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 627469

You seem to want unique occurrences, use

grep -Eoha '\./[^/]*/' ./without_localnamespace.txt | uniq

See the online demo

Regarding the pattern, you do not need to escape forward slashes, they are not special regex metacharacters. The -i flag is redundant here, too.

Upvotes: 0

P....
P....

Reputation: 18411

awk -F'/' '!a[$2]++{print $1 FS $2 FS}' input
./bob/
./sue/
./john/

Upvotes: 2

Related Questions