使用shell合并N个已排序的文件

时间:2014-03-04 03:15:54

标签: shell

我有N个文件,每个文件中的内容都已排序,现在我想使用sort -m合并这些N个文件,这是一个N路合并。

但我有这个问题,这N个文件中的每一个都在更新,这意味着每个文件中的内容是另一个程序的输出,程序会不断地将输出写入每个文件。

例如,此时,第一个文件如下所示:

1
3
5

10分钟后,它被程序更新,如下所示:

1
3
5
7
9
11

如果N个文件没有更新,我可以简单地使用sort -m,但现在该怎么做?

为了澄清,我最终想要的是,N个文件中的所有内容都应该合并到一个最终文件中,这意味着如果这些文件被更新,那么新更新的内容也应该合并。

更新

Bash on Linux ,每个文件中的行按单调递增顺序,文件之间没有重复。

1 个答案:

答案 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阵列上的文件。