James Carlin
James Carlin

Reputation: 13

Prepend text to specific line numbers with variables

I have spent hours trying to solve this. There are a bunch of answers as to how to prepend to all lines or specific lines but not with a variable text and a variable number.

while [ $FirstVariable -lt $NextVariable ]; do
  #sed -i "$FirstVariables/.*/$FirstVariableText/" "$PWD/Inprocess/$InprocessFile"
  cat "$PWD/Inprocess/$InprocessFile" | awk 'NR==${FirstVariable}{print "$FirstVariableText"}1' > "$PWD/Inprocess/Temp$InprocessFile"
  FirstVariable=$[$FirstVariable+1]
done 

Essentially I am looking for a particular string delimiter and then figuring out where the next one is and appending the first result back into the following lines... Note that I already figured out the logic I am just having issues prepending the line with the variables.

Example:

This >

Line1:
1
2
3

Line2:
1
2
3

Would turn into >

Line1:
Line1:1
Line1:2
Line1:3

Line2:
Line2:1
Line2:2
Line2:3

Upvotes: 0

Views: 139

Answers (2)

j23
j23

Reputation: 3530

You can do all that using below awk one liner.

Assuming your pattern starts with Line, then the below script can be used.

> awk '{if ($1 ~ /Line/ ){var=$1;print $0;}else{ if ($1 !="")print var $1}}' $PWD/Inprocess/$InprocessFile

Line1:
Line1:1
Line1:2
Line1:3
Line2:
Line2:1
Line2:2
Line2:3

Here is how the above script works:

If the first record contains word Line then it is copied into an awk variable var. From next word onwards, if the record is not empty, the newly created var is appended to that record and prints it producing the desired result.

If you need to pass the variables dynamically from shell to awk you can use -v option. Like below:

awk -v var1=$FirstVariable -v var2=$FirstVariableText 'NR==var{print var2}1' > "$PWD/Inprocess/Temp$InprocessFile"

Upvotes: 1

kvantour
kvantour

Reputation: 26491

The way you addressed the problem is by parsing everything both with bash and awk to process the file. You make use of bash to extract a line, and then use awk to manipulate this one line. The whole thing can actually be done with a single awk script:

awk '/^Line/{str=$1; print; next}{print (NF ? str $0 : "")}' inputfile > outputfile

or

awk 'BEGIN{RS="";ORS="\n\n";FS=OFS="\n"}{gsub(FS,OFS $1)}1' inputfile > outputfile

Upvotes: 0

Related Questions