我是脚本编写新手,有如下要求。
有一个名为 jobname.txt 的文件,其内容如下
job1
job2
有一个名为 value.txt 的文件,其内容如下
10
20
我需要像这样打印输出
update_job: job1
max_run_alarm: 10
update_job: job2
max_run_alarm: 20
我如何使用 shell 脚本或 awk 来做到这一点?
答案1
与paste
+ awk
:
$ paste -d'\n' jobname.txt value.txt \
|awk '{ print (NR%2?"update_job:":"max_run_alarm:", $0) }'
基本上,paste
正如其名称所示,我们逐行粘贴两个文件,但\n
在每行之间添加一个 ewline 字符,然后我们重新处理之前的输出,awk
并在前面添加所需的内容“文本”对于行号为 2 模的行(行号为偶数的行;例如行号 2、4、6、...;包含NR
以下行的行号:awk被读取以进行处理)我们在前面添加文本“更新作业:“或者对于奇数行号,我们在前面添加文本”最大运行警报:",然后打印该行本身$0
。
只需awk
:
awk 'NR==FNR{
getline val<ARGV[2]; print "update_job:", $0 ORS "max_run_alarm:", val; next
}
{ exit }' jobname.txt value.txt
这里我们处理不同,上面我们说NR是行号,这里你看FNR; NR 和 FNR 始终具有相同的值(即,它们都包含行号),但 NR 对于所有输入文件的所有行都保持递增,而一旦读取下一个输入文件(如果有),FNR 就会重置回 1 ,因此NR==FNR
我们确保以下代码块仅针对第一个输入文件运行。
然后我们称“getline
从文件转换为变量“从我们作为输入传递的第二个参数中读取一行(这里ARGV[2]
return value.txt
) 并将其保存到val
变量中;然后剩下的就是打印东西了。 ORS 在每个之间打印一个换行符。
或者也许你更喜欢这个(但我不喜欢硬编码文件名):
awk '{
getline val<"value.txt"; print "update_job:", $0 ORS "max_run_alarm:", val
}' jobname.txt
答案2
$ paste jobname.txt value.txt |
awk '{printf "update_job: %s\nmax_run_alarm: %s\n\n", $1, $2}'
update_job: job1
max_run_alarm: 10
update_job: job2
max_run_alarm: 20
或全部在 awk 中:
$ awk '
NR==FNR { jobs[NR]=$1; next }
{ printf "update_job: %s\nmax_run_alarm: %s\n\n", jobs[FNR], $1 }
' jobname.txt value.txt
update_job: job1
max_run_alarm: 10
update_job: job2
max_run_alarm: 20
上述两者都使用强制性 POSIX 工具,因此可以在每个 Unix 机器上的任何 shell 中工作。
答案3
和awk
:
awk '{printf "update_job: %s\n", $1 ; getline < "value.txt"; printf "max_run_alarm: %s\n\n", $1 }' jobname.txt
第一个printf
命令打印第一个文件中的行jobname.txt
。然后getline
命令从文件中获取行value.txt
。然后printf
命令打印该行。
看http://awk.freeshell.org/AllAboutGetline了解何时以及如何使用getline
.
答案4
co=`awk 'END{print NR}' jobname.txt`
for ((i=1;i<=$co;i++)); do awk -v i="$i" 'NR==i{print "update_job: "$1}' jobname.txt; awk -v i="$i" 'NR==i{print "max_run_alarm: "$1}' value.txt;echo -e "\n"; done
输出
update_job: job1
max_run_alarm: 10
update_job: job2
max_run_alarm: 20