ben shalev
ben shalev

Reputation: 103

Awk printing each line in file seperatly

I am making a script that takes a list of zones records and values and puts it in a DNS server. The formatting for the wanted output is just for ansible, the problem is i get that i can't operate on each line seperatly with awk. What it does is when i don't mention a NR it prints all the items in the same line. When i mention an NR it prints either nothing or only the specified NR (Ie only if i do NR==1 it will print the first line) My objective is to iterate on all lines and print them in the format i want with newline after end of line.

bash_script

#! /bin/bash

read -p "File: " file
zone=`awk 'NR==1 { print $2}' ${file}`
echo "${zone}:" >> /etc/ansible/roles/create_dns/defaults/main/${zone}.yml

lines=`wc -l < ${file}`
for line_num in $(seq 1 $lines)
do
        echo $line_num
        echo `awk 'NR==$line_num {print "  - { zone: \x27" $2"\x27, record: \x27" $1"\x27, value: \x27" $3"\x27 }\\n"}' ${file}` >> /etc/ansible/roles/create_dns/defaults/main/${zone}.yml
done

$file

ansible ben.com 10.0.0.10
test ben.com 10.0.0.110
example ben.com 10.0.0.120

Wanted output:

ben.com:
  - { zone: 'ben.com', record: 'ansible', value: '10.0.0.10' }
  - { zone: 'ben.com', record: 'test', value: '10.0.0.110' }
  - { zone: 'ben.com', record: 'example', value: '10.0.0.120' }

Output i get:

ben.com:



Upvotes: 2

Views: 282

Answers (2)

anubhava
anubhava

Reputation: 785551

You can use this single awk for this:

read -p "File: " file
awk '{printf "\t- { zone: \047%s\047, record: \047%s\047, value: \047%s\047 }\n", $2, $1, $3 > $2}' "$file"
cat ben.com

   - { zone: 'ben.com', record: 'ansible', value: '10.0.0.10' }
   - { zone: 'ben.com', record: 'test', value: '10.0.0.110' }
   - { zone: 'ben.com', record: 'example', value: '10.0.0.120' }```

Upvotes: 4

RavinderSingh13
RavinderSingh13

Reputation: 133610

With your shown samples, please try following solution. This is a Generic solution, on basis of, you could give a number of column names in BEGIN section of this program under split section, but this is considering that you want to add strings(eg: zone, record etc) before each field/column values. IN case your number of strings are lesser than number of fields/columns in Input_file then you can change condition from i<=NF too as per your need, to fetch how many columns you want to get.

read -p "File: " file
awk -v s1='\047' 'BEGIN{OFS=", ";split("zone:,record:,value:",headings,",")} {for(i=1;i<=NF;i++){$i=headings[i]" " s1 $i s1};$0="  - { " $0" }"} 1' "$file"

Adding a non one liner form of solution here:

awk -v s1="'" '
BEGIN{
  OFS=", "
  split("zone:,record:,value:",headings,",")
}
{
  for(i=1;i<=NF;i++){
    $i=headings[i]" " s1 $i s1
  }
  $0="  - { " $0" }"
}
1
' "$file"

Upvotes: 3

Related Questions