我想在文本文件中添加一行,以便对文本文件最初排序的结果进行排序。例如:
cp file tmp; echo "new line" >> tmp; sort tmp > file; rm -f tmp
我真的很想不带临时文件和不带分号(使用管道代替?);使用sed
是可以接受的。这可能吗?如果可以,怎么做?
这是我能想到的没有任何临时文件的最短的一个班轮:
$ echo "something" >> file; sort file -o file
echo "New Line" | sort -o file - file
这-o file
意味着将结果写入文件(并且将任何输入文件作为输出文件是明确安全的)。-
本身的意思是“读取标准输入”,其中包含新的信息行。file
末尾的意思是“也读过” file
。这适用于大约 1978 年(至少)第 7 版 UNIX™ 起的任何 Unix 排序,甚至可能在此之前。没有临时文件或对其他实用程序的依赖项。
鉴于单行已“排序”并且文件也已排序,您可以通过合并两个排序的输入来加快处理速度:
echo "New Line" | sort -o file -m - file
即使是非常古老的排序命令,这也适用。
是的,假设它们没有选项卡,您将需要使用它们或comm
将它们放在一起(如果它们已经预先排序) ,这将为您节省排序(根据文件大小可能会产生临时文件和开销)。
选择:
comm -3 file <(echo "new line") |tr -d '\t'
这可能是“最短的”:
sort -m file <(echo "new line")
您可以在没有任何分号和临时文件的情况下执行此操作,但可能不能不依赖某些可能并非无处不在的实用程序(例如带有就地文件修改的 awk 或 perl)。
为什么不想使用临时文件或分号?
编辑:既然分号是可以的,怎么样:
val=$(cat file); { echo "$val"; echo "new line"; } | sort > file
大文件/性能:
将您的文件转换为具有单个索引列的 SQLite 数据库并进行查询。
或者自己重新实现基于文件的 B 树或哈希映射,SQLite 如何实现索引...
我认为不可能有效地插入已排序的文本文件:即使您进行二进制搜索,您仍然必须复制插入点之后的所有内容,并且磁盘操作将成为瓶颈:https://unix.stackexchange .com/questions/87772/add-lines-to-the-beginning-and-end-of-the-huge-file
对于搜索,sgrep
可能有效:https ://askubuntu.com/questions/423886/efficiently-search-sorted-file/701237#701237