Control-break"ish" in awk


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers Control-break"ish" in awk
# 8  
Old 01-19-2015
Hello beca123456,

I am not sure if you correctly used my scipt see following I am getting correct output only for both examples provided by you as follows.

Input_file is:
Code:
cat test17
1|Bob
3|Bob
Ref|Bob
2|Rick
5|Rick
1|Rick
Ref|Rick
7|Paul
Ref|Paul

Code is as follows:
Code:
cat test17.ksh
awk -F"|" 'FNR==NR      {
                                i=0;
                        {
                                if($1 ~ /Ref/)
                                                {
                                                        next
                                                };
                                X[$2]=$1>3?X[$2]+1:X[$2]+0;next
                        }
                        };
                        {
                                A=$2;
                        {
                                if(X[A] >= 1 && $1=="Ref")
                                                {
                                                        print $0
                                                }
                                else if(X[A] < 1 && $1=="Ref")
                                                {
                                                        $0=$0 OFS "*";
                                                        print $0
                                                }
                                else
                                                {
                                                        print $0
                                                }
                        }
                        }
           ' OFS="|" test17 test17

Output is as follows.
Code:
./test17.ksh
1|Bob
3|Bob
Ref|Bob|*
2|Rick
5|Rick
1|Rick
Ref|Rick
7|Paul
Ref|Paul

2nd example of yours:

Input_file:
Code:
cat test17
1|Bob
3|Bob
Ref|Bob
5|Rick
1|Rick
Ref|Rick

Code is as follows:
Code:
./test17.ksh
1|Bob
3|Bob
Ref|Bob|*
5|Rick
1|Rick
Ref|Rick

Thanks,
R. Singh
# 9  
Old 01-19-2015
Ok, there were few differences between the one liner and the developed code.
But still I am not sure I understand how it works...

It works except when $1=4. It should be treated the same as when $1<4.

In other words, for each groups, if the max value of $1 is <=4, then a "*" must be added at the end of the Ref record of the group.
If the max value of $1 in a group is >4, then the Ref record is unchanged.Smilie
# 10  
Old 01-19-2015
Hello beca123456,

I can say finally following both can help you.
Code:
awk -F"|" 'FNR==NR{if($1 ~ /Ref/){next};X[$2]=$1>3?X[$2]+1:X[$2]+0;next}; {A=$2;{if(X[A] >= 1 && $1=="Ref"){;print $0} else if(X[A] < 1 && $1=="Ref"){$0=$0 OFS "*";print $0} else {print $0}}}' OFS="|" test17 test17

OR
Code:
awk -F"|" 'FNR==NR      {
                                if($1 ~ /Ref/)
                                                {
                                                        next
                                                };
                                X[$2]=$1>3?X[$2]+1:X[$2]+0;next
                        }
                        {
                                A=$2;
                        {
                                if(X[A] >= 1 && $1=="Ref")
                                                {
                                                        print $0
                                                }
                                else if(X[A] < 1 && $1=="Ref")
                                                {
                                                        $0=$0 OFS "*";
                                                        print $0
                                                }
                                else
                                                {
                                                        print $0
                                                }
                        }
                        }
           ' OFS="|" test17 test17


Let me know if these are working well for you.

EDIT: Adding explaination for same as follows.
Code:
awk -F"|" 'FNR==NR      {                                                           #This condition will be true when first file gets read
                                if($1 ~ /Ref/)                                            #When first field has string Ref to check this condition
                                                {
                                                        next                                #Don't do further operations and move next if this condition is TRUE
                                                };
                                X[$2]=$1>3?X[$2]+1:X[$2]+0;next            #Making an array named X with index $2 and checking there if 
                                                                                             #If any value of $1 is greater than 3 then add 1 to value of array X 
                                                                                             #with index $2 else add nothing(0) with value of X[$2]
                        }
                        {
                                A=$2;                                                    #This will be done when second file getting read save $2 value in a variable named A
                        {
                                if(X[A] >= 1 && $1=="Ref")                      #Check condition if value of array X with index A(which is $2 of file)
                                                                                            #is greater than 1 and it's $1 is string Ref
                                                {
                                                        print $0                         #Simply print line as seems there will be a value of $1 equal or greater than 4
                                                 }
                                else if(X[A] < 1 && $1=="Ref")                #If arrayX with index A is less than 1 and 41 is string Ref
                                                {
                                                        $0=$0 OFS "*";              #means need to add * at end so dong the same adding * at end of line now
                                                        print $0                         #printing the same line now
                                                }
                                else
                                                {
                                                        print $0                        #If both the above conditions are fales print line simply
                                                }
                        }
                        }
           ' OFS="|" test17 test17                                               # setting Output field seperator and calling Input_file 2 times


Thanks,
R. Singh

Last edited by RavinderSingh13; 01-19-2015 at 08:28 AM.. Reason: Removed a unncessary variable i=0 in solution except that is working fine + added a detailed explaination for code
This User Gave Thanks to RavinderSingh13 For This Post:
# 11  
Old 01-19-2015
If the "Ref" record is always the last one in a group, try
Code:
awk     '$1=="Ref" &&
         MAX[$2]<=4     {$2=$2"|*"}
         1
         $1>MAX[$2]     {MAX[$2]=$1+0}
        ' FS="|" OFS="|" file
1|Bob
3|Bob
Ref|Bob|*
2|Rick
5|Rick
1|Rick
Ref|Rick
7|Paul
Ref|Paul

This User Gave Thanks to RudiC For This Post:
# 12  
Old 01-19-2015
Thanks a lot RudiC and RavinderSingh13. Both methods work perfectly ! Smilie
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Bash script - Print an ascii file using specific font "Latin Modern Mono 12" "regular" "9"

Hello. System : opensuse leap 42.3 I have a bash script that build a text file. I would like the last command doing : print_cmd -o page-left=43 -o page-right=22 -o page-top=28 -o page-bottom=43 -o font=LatinModernMono12:regular:9 some_file.txt where : print_cmd ::= some printing... (1 Reply)
Discussion started by: jcdole
1 Replies

2. UNIX for Dummies Questions & Answers

Find a string across line break (because of "segmentation fault core dumped")

Hi, thanks to a precedent post, and thanks to the reply of derekludwig of the forum, I have convert my first awk command as : test.txt is : AAAAAGHIJKLAjKMEFJKLjklABCDJkLEFGHIJKL awk -f findstring.awk test.txt > textreturn.txtfindstring.awk is : BEGIN{ SLENGTH = 3 } { ... (3 Replies)
Discussion started by: thewizarde6
3 Replies

3. Tips and Tutorials

How to do a "Control Break" (Algorithm)

A vast amount of problems asked in "Shell Programming an Scripting" can be traced back to be an application of a basic algorithm called a Control Break. Every programmer - and script writers are programmers nonetheless - should immediately recognize problems of this sort and know how to deal with... (1 Reply)
Discussion started by: bakunin
1 Replies

4. Shell Programming and Scripting

how to use "cut" or "awk" or "sed" to remove a string

logs: "/home/abc/public_html/index.php" "/home/abc/public_html/index.php" "/home/xyz/public_html/index.php" "/home/xyz/public_html/index.php" "/home/xyz/public_html/index.php" how to use "cut" or "awk" or "sed" to get the following result: abc abc xyz xyz xyz (8 Replies)
Discussion started by: timmywong
8 Replies

5. Shell Programming and Scripting

awk command to replace ";" with "|" and ""|" at diferent places in line of file

Hi, I have line in input file as below: 3G_CENTRAL;INDONESIA_(M)_TELKOMSEL;SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL My expected output for line in the file must be : "1-Radon1-cMOC_deg"|"LDIndex"|"3G_CENTRAL|INDONESIA_(M)_TELKOMSEL"|LAST|"SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL" Can someone... (7 Replies)
Discussion started by: shis100
7 Replies

6. Shell Programming and Scripting

Simplify Bash Script Using "sed" Or "awk"

Input file: 2 aux003.net3.com error12 6 awn0117.net1.com error13 84 aux008 error14 29 aux001.ha.ux.isd.com error12 209 aux002.vm.ux.isd.com error34 21 alx0027.vm.net2.com error12 227 dux001.net5.com error123 22 us008.dot.net2.com error121 13 us009.net2.com error129Expected Output: 2... (4 Replies)
Discussion started by: sQew
4 Replies

7. Shell Programming and Scripting

"last" in perl vs "break" elsewhere

Is there a functional difference between the two statements? (4 Replies)
Discussion started by: thmnetwork
4 Replies

8. Shell Programming and Scripting

cat $como_file | awk /^~/'{print $1","$2","$3","$4}' | sed -e 's/~//g'

hi All, cat file_name | awk /^~/'{print $1","$2","$3","$4}' | sed -e 's/~//g' Can this be done by using sed or awk alone (4 Replies)
Discussion started by: harshakusam
4 Replies

9. Shell Programming and Scripting

help for saving vertical datas to horizontal with "awk" or "cut"

hi, i have a file having datas like that ./a.txt 12344 12345 12346 12347 ..... ..... ... i want to save this datas to another file like that ./b.txt 12344 12345 12346 12347 ... ... ... i think awk can make this but how? :) waiting for ur help. (3 Replies)
Discussion started by: mercury
3 Replies

10. UNIX for Dummies Questions & Answers

Explain the line "mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'`"

Hi Friends, Can any of you explain me about the below line of code? mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'` Im not able to understand, what exactly it is doing :confused: Any help would be useful for me. Lokesha (4 Replies)
Discussion started by: Lokesha
4 Replies
Login or Register to Ask a Question