'Grep to select alternate outputs after certain Characters

I have a text file test.txt

It has list as follows
Profile Roy
 City: New York
 Age: 78_months
 Sex: Male
Profile Smith
 City: Texas
 Age: 56_months
 Sex: Male

What I want is to grep output of Roy and Smith and so on so forth...... such that it should output as

78_months New York
56_months Texas

What I tried so far didn't work

grep -l 'Age:|City:' test.txt >> output txt



Solution 1:[1]

I would not use grep here, look into sed or awk ..

example for awk/sed well haven't used them in a while ..

Person Name
123 High Street
(222) 466-1234

Another person
487 High Street
(523) 643-8754


$ awk 'BEGIN{FS="\n"; RS=""} {print $1,$3}' addresses

will output

Person Name (222) 466-1234
Another person (523) 643-8754

so awk '/Age|City/,1' will output

 
 City: New York
 Age: 78_months
 City: Texas
 Age: 56_months

Then awk awk '{x = $0; getline; print; print x}'

will switch lines to

 Age: 78_months
 City: New York
 Age: 56_months
 City: Texas

so a quickhack is

awk '/Age|City/,1' test | awk '{x = $0; getline; print; print x}' | sed -r 's/Age://g' | sed -r 's/City://g' | xargs -n2 | sed 's/ */ /g'

:P

78_months New York
56_months Texas

Solution 2:[2]

Suggesting awk script:

 awk '{print $5, $3}' RS="Profile" FS="[:\n]" input.1.txt

Output for provided input:

$ awk '{print $5, $3}' RS="Profile" FS="[:\n]" input.1.txt
 
 78_months  New York
 56_months  Texas

Explanation:

{print $5, $3} Print 5th field and 3rd field following by newline.

RS="Profile" Set awk record separator to RegExp "Profile"

FS="[:\n]" Set awk field separator to char : and newline \n

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Dudi Boy