nikhila reddy
nikhila reddy

Reputation: 63

Merging the rows in a file using awk

Can somebody explain the meaning of the below script please?

awk -F "," 's != $1 || NR ==1{s=$1;if(p){print p};p=$0;next}
            {sub($1,"",$0);p=p""$0;}
            END{print p}' file

The file has the following data:

2,"URL","website","aaa.com"
2,"abc","text","some text"
2,"Password","password","12345678"
3,"URL","website","10.0.10.75"
3,"uname","text","some text"
3,"Password","password","password"
3,"ulang","text","some text"
4,"URL","website","192.168.2.110"
4,"Login","login","admin"
4,"Password","password","blah-blah"

and the output is:

2,"URL","website","aaa.com","abc","text","some text",Password","password","12345678"
3,"URL","website","10.0.10.75","uname","text","some text""Password","password","password","ulang","text","some text"

Upvotes: 0

Views: 58

Answers (1)

karakfa
karakfa

Reputation: 67467

awk has this structure

pattern {action}

for your script, let's analyze the elements, first pattern

 s != $1 || NR == 1   # if the variable s is not equal to first field
                      # or we're operating on first row

first action

 s = $1   # assign variable s to first field
 if (p) {  # if p is not empty, print
     print p
 }
 p = $0    # assign the current line to p variable
 next      # move to next, skip the rest

next pattern is missing, so the action will apply to all rows

 sub($1, "", $0)   # same as $1="", will clear the first field
 p = ((p "") $0)   # concat new line to p

last pattern is special reserved word END, only applied when all rows are consumed (there is counterpart BEGIN that's applied before the file is opened)

 END {
      print p      # print the value of p
 }

Upvotes: 1

Related Questions