You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比名称含date命令生成小时变量的文件?

解决文件对比问题

问题背景

  • 当前小时的文件file2-$(date +%H).txt内容:
    line1
    line2
    
  • 上一小时的文件file1-$(date -d '1 hour ago' '+%H').txt内容:
    line2
    
  • 预期输出:找出file2-当前小时.txt中不存在于file1-上一小时.txt的行,即:
    line1
    

现有命令的错误分析

  1. 第一条命令错误:

    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错误。

  2. 第二条命令错误:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:13:21