如何对比名称含date命令生成小时变量的文件?
解决文件对比问题
问题背景
- 当前小时的文件
file2-$(date +%H).txt内容:line1 line2 - 上一小时的文件
file1-$(date -d '1 hour ago' '+%H').txt内容:line2 - 预期输出:找出
file2-当前小时.txt中不存在于file1-上一小时.txt的行,即:line1
现有命令的错误分析
第一条命令错误:
awk -v now="$(date +%H)" -v an_hour_ago="$(date -d '1 hour ago' '+%H')" 'FNR==NR{a[$0];next} !($0 in a)' 'file1-'now'.txt' 'file2-'an_hour_ago'.txt'单引号会阻止Shell解析变量
now和an_hour_ago,因此Shell会将文件名解析为字面的file1-now.txt和file2-an_hour_ago.txt,导致找不到文件,抛出No such file or directory错误。第二条命令错误:
awk 'FNR==NR{a[$0];next} !($0 in a)' "file1-$(date +%H).txt" "file2-$(date -d '1 hour ago' '+%H').txt"- 文件名匹配错误:需要对比的是上一小时的file1和当前小时的file2,但命令中使用了当前小时的file1和上一小时的file2,完全不符合需求。
- awk处理顺序逻辑:awk会先读取第一个文件并将行存入数组,再读取第二个文件输出不在数组中的行。这里需要先读取作为排除基准的
file1-上一小时.txt,再读取要筛选的file2-当前小时.txt,但命令的文件顺序和目标文件都错了。
正确解决方案
方法1:分步定义变量(可读性更高)
# 获取上一小时和当前小时的数值 prev_hour=$(date -d '1 hour ago' '+%H') curr_hour=$(date +%H) # 先读取基准文件(上一小时的file1),再读取待筛选文件(当前小时的file2) awk 'FNR==NR{a[$0];next} !($0 in a)' "file1-${prev_hour}.txt" "file2-${curr_hour}.txt"
方法2:直接嵌入变量(一行命令)
awk 'FNR==NR{a[$0];next} !($0 in a)' "file1-$(date -d '1 hour ago' '+%H').txt" "file2-$(date +%H).txt"
执行以上命令后,即可得到预期输出line1。
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

