Shell one-liner将一行添加到已排序的文件中

时间:2012-05-18 19:04:20

标签: shell sorting sed pipe

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

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

我真的很喜欢没有临时文件而没有分号(使用管道代替吗?);使用sed是可以接受的。这是可能的,如果是的话,怎么样?

5 个答案:

答案 0 :(得分:7)

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

$ echo "something" >> file; sort file -o file

答案 1 :(得分:7)

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

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

鉴于单行是“已排序”且文件也按排序顺序排列,您可以通过合并两个已排序的输入来加快进程:

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

即使是非常旧的排序命令,也可以使用它。

答案 2 :(得分:1)

是的,您需要求助或comm他们在一起(如果他们已经预先排序)假设他们没有标签,这将为您节省sort(根据文件大小可以产生临时文件和开销)。

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

这可能是&#34;最短的&#34;: sort -m file <(echo "new line")

答案 3 :(得分:0)

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

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

编辑:因为分号是好的,怎么样:

val=$(cat file); { echo "$val"; echo "new line"; } | sort > file

答案 4 :(得分:0)

大文件/效果

使用单个索引列将文件转换为SQLite数据库并查询该文件。

或者自己重新实现基于文件的B树或哈希映射,这就是SQLite如何实现索引......

我认为无法有效地插入已排序的文本文件:即使您进行二进制搜索,您仍然必须复制插入点之后的所有内容,并且该磁盘操作将成为瓶颈:{{3} }

对于搜索,sgrep可能有效:https://unix.stackexchange.com/questions/87772/add-lines-to-the-beginning-and-end-of-the-huge-file