use*_*342 1 awk text-processing
我是脚本的新手,有如下要求。
有一个名为 jobname.txt 的文件,其内容如下
job1
job2
Run Code Online (Sandbox Code Playgroud)
有一个名为 value.txt 的文件,其内容如下
10
20
Run Code Online (Sandbox Code Playgroud)
我需要打印输出
update_job: job1
max_run_alarm: 10
update_job: job2
max_run_alarm: 20
Run Code Online (Sandbox Code Playgroud)
如何使用 shell 脚本或 awk 执行此操作?
与paste+ awk:
$ paste -d'\n' jobname.txt value.txt \
|awk '{ print (NR%2?"update_job:":"max_run_alarm:", $0) }'
Run Code Online (Sandbox Code Playgroud)
基本上paste按照它的名字所说的命令,我们从每个文件中逐行粘贴两个文件,但\n在每行之间添加一个ewline 字符,然后我们重新处理先前的输出,awk并为它们的行添加所需的“文本”行号是 2 的模块(具有偶数行号的行;例如行号 2、4、6、...;NR包含awk为处理而读取的行的行号)我们在前面添加文本“ update_job: ”或者对于奇数行号,我们在前面加上文本“ max_run_alarm: ”,然后打印行本身$0。
只需awk:
awk 'NR==FNR{
getline val<ARGV[2]; print "update_job:", $0 ORS "max_run_alarm:", val; next
}
{ exit }' jobname.txt value.txt
Run Code Online (Sandbox Code Playgroud)
这里我们处理不同,上面我们说NR是行号,这里你看FNR;NR 和 FNR 始终具有相同的值(即,它们都包含行号)但 NR 为所有输入文件的所有行不断增加,而 FNR 在读取下一个输入文件(如果有)时立即重置为 1 ,所以说NR==FNR我们确保以下代码块仅针对第一个输入文件运行。
然后我们调用“ getlineinto a Variable from a File ”从我们作为输入传递的第二个参数中读取一行(这里是ARGV[2]return value.txt)并将其保存到val变量中;那么剩下的就是打印东西了。ORS 在每个之间打印一个换行符。
或者你可能更喜欢这个(但我不喜欢硬编码文件名):
awk '{
getline val<"value.txt"; print "update_job:", $0 ORS "max_run_alarm:", val
}' jobname.txt
Run Code Online (Sandbox Code Playgroud)