如何将目录中最新带时间戳文件作为gawk的第二个输入文件?
自动传入最新文件到gawk的解决方案
问题描述
需要用gawk处理两个文件:第一个文件名固定为file_1,第二个文件名前缀固定为2nd_file_,后缀是每次创建都会变化的日期时间戳,希望自动使用该文件的最新版本,而非手动输入文件名。
实现方法
方法1:基于ls命令的命令替换
利用命令替换直接获取最新文件名并传入gawk,用双引号包裹避免特殊字符解析问题:
gawk -F[,$'\t'"}\"] '{ do something }' file_1 "$(ls -lt 2nd_file_* | tail -n 1 | awk '{print $NF}')" > output_file
ls -lt:按修改时间从新到旧排序文件tail -n 1:取排序后的最后一行(对应最新文件)awk '{print $NF}':提取该行的最后一列(即文件名)- 双引号包裹命令替换结果,防止文件名含空格或特殊字符时出错
方法2:用find命令更可靠(推荐)
find命令处理特殊文件名的兼容性更好,避免ls在极端场景下的解析问题:
# 先获取最新文件路径 latest_file=$(find . -maxdepth 1 -type f -name "2nd_file_*" -printf "%T@ %p\n" | sort -nr | head -n 1 | awk '{print $2}') # 执行gawk命令 gawk -F[,$'\t'"}\"] '{ do something }' file_1 "$latest_file" > output_file
find . -maxdepth 1 -type f -name "2nd_file_*":仅查找当前目录下符合前缀的普通文件-printf "%T@ %p\n":输出文件的epoch时间戳和完整路径sort -nr:按时间戳从大到小排序head -n 1:取最新的文件条目
方法3:利用Bash数组(适用于文件名按时间顺序字母排序的场景)
如果你的日期时间戳格式(如2024_03_21_[18-21-32])的字母排序和实际时间顺序一致,可以直接用Bash数组简化操作:
# 将所有匹配文件存入数组 files=(2nd_file_*) # 取数组最后一个元素(对应最新文件) latest_file=${files[-1]} # 执行gawk命令 gawk -F[,$'\t'"}\"] '{ do something }' file_1 "$latest_file" > output_file
内容的提问来源于stack exchange,提问作者Ouch
相关产品推荐
相关产品推荐

