Question

Can someone please help me with this parsing using awk?
Sorry I don't have any code My input space separated text file ( the file has a few more fields in the item lines)

category is fruits


item id  8837878
item id  8837879
item id  8837880
item id  8837881
item id  8837882
item id  8837883
item id  8837884
item id  8837885
item id  8837886
item id  8837887
item id  8837888
item id  8837889


category is veg

item id  8837890
item id  8837891
item id  8837892
item id  8837893
item id  8837894
item id  8837895
item id  8837896
item id  8837897

Required tab separated output file

fruits item id  8837878
fruits item id  8837879
fruits item id  8837880
fruits item id  8837881
fruits item id  8837882
fruits item id  8837883
fruits item id  8837884
fruits item id  8837885
fruits item id  8837886
fruits item id  8837887
fruits item id  8837888
fruits item id  8837889
veg item id  8837890
veg item id  8837891
veg item id  8837892
.....
Was it helpful?

Solution

One way with awk:

$ awk '/^category/{c=$3}/^item/{print c,$0}' file
fruits item id  8837878
fruits item id  8837879
fruits item id  8837880
fruits item id  8837881
fruits item id  8837882
fruits item id  8837883
fruits item id  8837884
fruits item id  8837885
fruits item id  8837886
fruits item id  8837887
fruits item id  8837888
fruits item id  8837889
veg item id  8837890
veg item id  8837891
veg item id  8837892
veg item id  8837893
veg item id  8837894
veg item id  8837895
veg item id  8837896
veg item id  8837897

To format the output exactly how you need it you can use printf:

$ awk '/^category/{c=$3}/^item/{printf "%s %s %s %d\n",c,$1,$2,$3}' file

So by tab separated output maybe you mean:

$ awk '/^category/{c=$3}/^item/{printf "%s %s %s\t%d\n",c,$1,$2,$3}' file

OTHER TIPS

This is an attempt:

If a line contains "is" in the 2nd field, then we store the category name, print an empty line and continue checking the file.

In the rest of cases, if the 2nd field is "id", we print the line preceded by the category name.

$ awk '$2=="is"{c=$3; print ""}$2=="id"{print c,$0}' file

fruits item id  8837878
fruits item id  8837879
fruits item id  8837880
fruits item id  8837881
fruits item id  8837882
fruits item id  8837883
fruits item id  8837884
fruits item id  8837885
fruits item id  8837886
fruits item id  8837887
fruits item id  8837888
fruits item id  8837889

veg item id  8837890
veg item id  8837891
veg item id  8837892
veg item id  8837893
veg item id  8837894
veg item id  8837895
veg item id  8837896
veg item id  8837897
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top