1

I have a file with a list of info. Each line has either 12 or 13 fields. For example I will use a file will 3 and 4 fields.

e.g. myfile.txt user password location date john passwd1 new_york today passwd2 london yesterday jeff passwd3 new_york tomorrow 

I am looking for a way that would take johns name and copy it to the next line in the blank space.

so far I am trying something like:

Awk '{{if(NF==4) print $0; name=$1}; if(NF==3) print $name,$0}' ./myfile.txt >> ./my_editedfile.txt. 

Every time I try, however, it either prints the literal $1, nothing, or the first field of the next line twice. i.e. line two will look like on of the following;

$1 passwd2 london yesterday passwd2 london yesterday passwd2 passwd2 london yesterday 

Can someone help to set a variable on one line and then use it to print on the following one?

5
  • Try it with print name, $0... Commented Sep 2, 2015 at 1:52
  • If I try that it will either print the literal $1 or nothing at all Commented Sep 2, 2015 at 1:57
  • 1
    awk '{if (NF==4) name=$1}; {print (NF==3) ? name $0 : $0 }' file Commented Sep 2, 2015 at 2:32
  • I wasn't sure how this worked. what is the ? and the : for? This looks like it could be really useful in other projects I am working on. Commented Sep 2, 2015 at 2:59
  • It's the ternary operator. Commented Sep 2, 2015 at 3:01

1 Answer 1

1

You are pretty close. You don't need the comma or the $ before your variable. Try:

awk '{if (NF == 4) {print $0; name=$1} else {print name$0}}' 
1
  • Ah! this works. The issue was the brackets. I was using {{if()}} changing it to {if(){}} worked perfectly! the Full code was sed -e 's/\t/_/g' -e 's/\( *\) /_/g' /var/tmp/all_disks | awk -F ":|=|_" '/Reallocated/ {if(NF==13){ print $1,$6,$13; name=$1}; if(NF==12) print name,$5,$12}' > /var/tmp/suspect_disks Commented Sep 2, 2015 at 2:53

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.