我有N个文件,每个文件中的内容都已排序,现在我想使用sort -m
合并这些N个文件,这是一个N路合并。
但我有这个问题,这N个文件中的每一个都在更新,这意味着每个文件中的内容是另一个程序的输出,程序会不断地将输出写入每个文件。
例如,此时,第一个文件如下所示:
1
3
5
10分钟后,它被程序更新,如下所示:
1
3
5
7
9
11
如果N个文件没有更新,我可以简单地使用sort -m
,但现在该怎么做?
为了澄清,我最终想要的是,N个文件中的所有内容都应该合并到一个最终文件中,这意味着如果这些文件被更新,那么新更新的内容也应该合并。
更新
Bash on Linux ,每个文件中的行按单调递增顺序,文件之间没有重复。
答案 0 :(得分:1)
由于这是linux,您可以依赖inotifywait
包中的inotify-utils
实用程序:
#!/bin/bash
FILES_TO_WATCH=("file1.txt" "file2.txt")
MERGED_FILE="merged.txt"
log() {
echo "[$(date -R)] $1" 1>&2
}
merge_files() {
log "Updating merged file"
sort -m "${FILES_TO_WATCH[@]}" > "$MERGED_FILE"
}
wait_for_changes() {
local changed_file
changed_file=$(inotifywait -qe modify "${FILES_TO_WATCH[@]}" --format "%w")
log "File '$changed_file' changed"
}
merge_files
while wait_for_changes; do
merge_files
done
inotifywait
命令的细分:
-q
保持安静,而不是将状态消息记录到stderr。
-e modify
收听“修改”事件。有关其他活动,请参阅man inotifywait
。
--format "%w"
使修改事件发生时仅打印文件名。
${FILES_TO_WATCH[@]}
展开FILES_TO_WATCH
阵列上的文件。