两个文件之间的映射

两个文件之间的映射

我是脚本编写新手,有如下要求。

有一个名为 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

相关内容