Awk 分别打印文件中的每一行
Awk printing each line in file seperatly
我正在制作一个脚本,它获取区域记录和值的列表并将其放入 DNS 服务器中。
所需输出的格式仅适用于 ansible,问题是我无法使用 awk 分别对每一行进行操作。
它的作用是当我没有提到 NR
时,它会在同一行中打印所有项目。
当我提到 NR
时,它不打印任何内容或仅打印指定的 NR(即只有当我执行 NR==1 时,它才会打印第一行)
我的 objective 是遍历所有行并以我想要的格式打印它们,并在行尾后换行。
bash_script
#! /bin/bash
read -p "File: " file
zone=`awk 'NR==1 { print }' ${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" "\x27, record: \x27" "\x27, value: \x27" "\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:
你可以用这个 awk
来做这个:
read -p "File: " file
awk '{printf "\t- { zone: 7%s7, record: 7%s7, value: 7%s7 }\n", , , > }' "$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' }```
使用您显示的示例,请尝试以下解决方案。这是一个通用解决方案,在此基础上,您可以在此程序的 split
部分下的 BEGIN
部分中提供一些列名,但这是考虑到您要添加字符串(例如:区域, 记录等) 在每个 field/column 值之前。如果您的字符串数量少于 Input_file 中的 fields/columns 数量,那么您也可以根据需要从 i<=NF 更改条件,以获取您想要获得的列数。
read -p "File: " file
awk -v s1='7' 'BEGIN{OFS=", ";split("zone:,record:,value:",headings,",")} {for(i=1;i<=NF;i++){$i=headings[i]" " s1 $i s1};[=10=]=" - { " [=10=]" }"} 1' "$file"
在这里添加一个非线性形式的解决方案:
awk -v s1="'" '
BEGIN{
OFS=", "
split("zone:,record:,value:",headings,",")
}
{
for(i=1;i<=NF;i++){
$i=headings[i]" " s1 $i s1
}
[=11=]=" - { " [=11=]" }"
}
1
' "$file"
我正在制作一个脚本,它获取区域记录和值的列表并将其放入 DNS 服务器中。
所需输出的格式仅适用于 ansible,问题是我无法使用 awk 分别对每一行进行操作。
它的作用是当我没有提到 NR
时,它会在同一行中打印所有项目。
当我提到 NR
时,它不打印任何内容或仅打印指定的 NR(即只有当我执行 NR==1 时,它才会打印第一行)
我的 objective 是遍历所有行并以我想要的格式打印它们,并在行尾后换行。
bash_script
#! /bin/bash
read -p "File: " file
zone=`awk 'NR==1 { print }' ${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" "\x27, record: \x27" "\x27, value: \x27" "\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:
你可以用这个 awk
来做这个:
read -p "File: " file
awk '{printf "\t- { zone: 7%s7, record: 7%s7, value: 7%s7 }\n", , , > }' "$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' }```
使用您显示的示例,请尝试以下解决方案。这是一个通用解决方案,在此基础上,您可以在此程序的 split
部分下的 BEGIN
部分中提供一些列名,但这是考虑到您要添加字符串(例如:区域, 记录等) 在每个 field/column 值之前。如果您的字符串数量少于 Input_file 中的 fields/columns 数量,那么您也可以根据需要从 i<=NF 更改条件,以获取您想要获得的列数。
read -p "File: " file
awk -v s1='7' 'BEGIN{OFS=", ";split("zone:,record:,value:",headings,",")} {for(i=1;i<=NF;i++){$i=headings[i]" " s1 $i s1};[=10=]=" - { " [=10=]" }"} 1' "$file"
在这里添加一个非线性形式的解决方案:
awk -v s1="'" '
BEGIN{
OFS=", "
split("zone:,record:,value:",headings,",")
}
{
for(i=1;i<=NF;i++){
$i=headings[i]" " s1 $i s1
}
[=11=]=" - { " [=11=]" }"
}
1
' "$file"