2

我想在文本文件中添加一行,以便对文本文件最初排序的结果进行排序。例如:

cp file tmp; echo "new line" >> tmp; sort tmp > file; rm -f tmp

我真的很想不带临时文件和不带分号(使用管道代替?);使用sed是可以接受的。这可能吗?如果可以,怎么做?

4

5 回答 5

7

这是我能想到的没有任何临时文件的最短的一个班轮:

$ echo "something" >> file; sort file -o file
于 2012-05-18T19:26:22.470 回答
7
echo "New Line" | sort -o file - file

-o file意味着将结果写入文件(并且将任何输入文件作为输出文件是明确安全的)。-本身的意思是“读取标准输入”,其中包含新的信息行。file末尾的意思是“也读过” file。这适用于大约 1978 年(至少)第 7 版 UNIX™ 起的任何 Unix 排序,甚至可能在此之前。没有临时文件或对其他实用程序的依赖项。

鉴于单行已“排序”并且文件也已排序,您可以通过合并两个排序的输入来加快处理速度:

echo "New Line" | sort -o file -m - file

即使是非常古老的排序命令,这也适用。

于 2012-05-18T19:30:50.237 回答
1

是的,假设它们没有选项卡,您将需要使用它们或comm将它们放在一起(如果它们已经预先排序) ,这将为您节省排序(根据文件大小可能会产生临时文件和开销)。

选择: comm -3 file <(echo "new line") |tr -d '\t'

这可能是“最短的”: sort -m file <(echo "new line")

于 2012-05-18T19:29:36.433 回答
0

您可以在没有任何分号和临时文件的情况下执行此操作,但可能不能不依赖某些可能并非无处不在的实用程序(例如带有就地文件修改的 awk 或 perl)。

为什么不想使用临时文件或分号?

编辑:既然分号是可以的,怎么样:

val=$(cat file); { echo "$val"; echo "new line"; } | sort > file
于 2012-05-18T19:17:24.763 回答
0

大文件/性能

将您的文件转换为具有单个索引列的 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

于 2015-11-22T19:44:04.600 回答