t28292
t28292

Reputation: 573

how can i echo a line once , then the rest keep them the way they are in unix bash?

I have the following comment:

(for i in 'cut -d "," -f1 file.csv | uniq`; do var =`grep -c $i file.csv';if (($var > 1 )); then echo " you have   the following repeated numbers" $i ; fi ; done)

The output that i get is : You have the following repeated numbers 455 You have the following repeated numbers 879 You have the following repeated numbers 741

what I want is the following output:

                        you have the following repeated numbers:
                        455
                        879
                        741

Upvotes: 0

Views: 103

Answers (2)

svante
svante

Reputation: 1385

Try moving the echo of the header line before the for-loop :

(echo " you have   the following repeated numbers"; for i in 'cut -d "," -f1 file.csv | uniq`; do var =`grep -c $i file.csv';if (($var > 1 )); then echo $i ; fi ; done)

Or only print the header once :

(header=" you have   the following repeated numbers\n"; for i in 'cut -d "," -f1 file.csv | uniq`; do var =`grep -c $i file.csv';if (($var > 1 )); then echo -e $header$i ; header=""; fi ; done)

Upvotes: 1

Piotr Wadas
Piotr Wadas

Reputation: 1894

Well, here's what I came to:

1) generated input for testing

for x in {1..35},aa,bb ; do echo $x ; done > file.csv 
for x in {21..48},aa,bb ; do echo $x ; done >> file.csv 
for x in {32..63},aa,bb ; do echo $x ; done >> file.csv
unsort file.csv > new.txt ; mv new.txt file.csv 

2) your line ( corrected syntax errors)

dtpwmbp:~ pwadas$ for i in $(cut -d "," -f1 file.csv | uniq); 
do var=`grep -c $i file.csv`; if [ "$var" -ge 1 ] ; 
 then echo " you have the following repeated numbers" $i ; fi ; done | head -n 10 

you have the following repeated numbers 8
you have the following repeated numbers 41
you have the following repeated numbers 18
you have the following repeated numbers 34
you have the following repeated numbers 3
you have the following repeated numbers 53
you have the following repeated numbers 32
you have the following repeated numbers 33
you have the following repeated numbers 19
you have the following repeated numbers 7
dtpwmbp:~ pwadas$ 

3) my line:

dtpwmbp:~ pwadas$ echo "you have the following repeated numbers:";  
 for i in $(cut -d "," -f1 file.csv | uniq); do var=`grep -c $i file.csv`; 
  if [ "$var" -ge 1 ] ; then echo $i ; fi ; done | head -n 10 
you have the following repeated numbers:
8
41
18
34
3
53
32
33
19
7

dtpwmbp:~ pwadas$

I added quotes, changed if() to [..] expression, and finally moved description sentence out of loop. Number of occurences tested is digit near "-ge" condition. If it is "1", then numbers which appear once or more are printed. Note, that in this expression, if file contains e.g. numbers

8 12 48

then "8" is listed in output as appearing twice. with "-ge 2", if no digits appear more than once, no output (except heading) is printed.

Upvotes: 0

Related Questions