Hi
i want to manipulate my data to convert row to column
name
600
Slno vlan
1 600
2 609
3 700
name
700
Slno vlan
1 600
2 609
3 700
I want to convert above file like this output
Slno vlan name
1 600 600
2 609 600
3 700 600
Slno vlan name
1 600 700
2 609 700
3 700 700
Please help me to convert
Thanks in advance
Yoda
November 28, 2013, 2:40pm
2
An awk approach:
awk '
/name/ {
print "Slno", "Name"
f = 0
getline
nm = $0
}
/Slno vlan/ {
f = 1
next
}
f && NF {
print $0, nm
}
' OFS='\t' file
RudiC
November 28, 2013, 2:47pm
3
Please use code tags as required by forum rules!
Try
awk '/name/ {getline name; next} NF {print $0, $1="Slno"?"name":name}' file
Slno vlan name
1 600 name
2 609 name
3 700 name
Slno vlan name
1 600 name
2 609 name
3 700 name
1 Like
Slight change to RudiC's solution to get last "name" field printing:
awk '/name/ {getline name; next} NF {print $0, $1=="Slno"?"name":name}' file
Slno vlan name
1 600 600
2 609 600
3 700 600
Slno vlan name
1 600 700
2 609 700
3 700 700
I tried a slightly different approach - using the blank lines as RS:
awk '
/name/ { name=$2; next }
/Slno vlan/ {
$1=$1" name";
for(i=2;i<=NF;i++) $i=$i" "name
}
1 ' FS='\n' OFS='\n' RS= infile
1 Like
Thanks for you replay.! its very use full
I need a slight change in the output as below
input file is like this
name1
600
Slno vlan
1 600
2 609
3 700
name2
700
Slno vlan
1 600
2 609
3 700
and out put file
Slno vlan name
1 600 name1
2 609 name1
3 700 name1
Slno vlan name
1 600 name2
2 609 name2
3 700 name2
Thank you
Try these changes to my earlier posted code:
awk '
!/Slno/ {
name=$1
next
}
/Slno vlan/ {
$1=$1" name";
for(i=2;i<=NF;i++) $i=$i" "name
}
1
' FS='\n' ORS='\n\n' OFS='\n' RS= infile
I am getting below output
awk '
!/Slno/ {
name=$1
next
}
/Slno vlan/ {
$1=$1" name";
for(i=2;i<=NF;i++) $i=$i" "name
}
1
' FS='\n' ORS='\n\n' OFS='\n' RS= test
OUTPUT
Slno vlan
1 600
2 609
3 700
Slno vlan
1 600
2 609
3 700
Slno vlan
1 600
2 609
3 700
Thank you..
Looks like you have some tabs in there, try:
awk '
!/Slno/ { name=$1; next}
{
$1=$1" name";
for(i=2;i<=NF;i++) $i=$i" "name
}
1
' FS='\n' ORS='\n\n' OFS='\n' RS= infile
1 Like
chubler_xl:
Looks like you have some tabs in there, try:
awk '
!/Slno/ { name=$1; next}
{
$1=$1" name";
for(i=2;i<=NF;i++) $i=$i" "name
}
1
' FS='\n' ORS='\n\n' OFS='\n' RS= infile
Its works ..! Thank you ..!