我想在文本文件中添加一行,以便对文本文件最初排序的结果进行排序。例如:
cp file tmp; echo "new line" >> tmp; sort tmp > file; rm -f tmp
我真的很喜欢没有临时文件而没有分号(使用管道代替吗?);使用sed
是可以接受的。这是可能的,如果是的话,怎么样?
答案 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