如何在Unix中应用具有相同输入和输出文件的sort和uniq?

时间:2015-12-28 16:51:04

标签: shell sorting unix io-redirection

我想在两个或多个文本文件上应用一些操作(交集和重聚) 所以在我把所有行放在一起后,我必须对该文件应用sort和uniq。 问题是我想拥有相同的输入和输出文件(-i不起作用)。 这是我的代码:

  nr_param=$#
    case $1 in

    '-r')
        if [ "$nr_param" = 3 ]
        then
            echo "reuniunea"
            rm -f reuniune1.txt
            cat $2 $3 >> reuniune1.txt
            sort <reuniune1.txt | uniq >reuniune.txt 
            rm -f reuniune1.txt
        else
            echo "parametri incorecti"
        fi;;
    '-i') 
        if [ "$nr_param" = 3 ]
        then
            echo "intersectia"
            rm -f intersectie.txt
            grep -Fx -f $2 $3 > intersectie.txt
        else
            echo "parametri incorecti"
        fi;;

你可以帮助我在不使用额外文件的情况下做同样的事情吗? 对于grep来说也是如此,如果$ 2将是&#34; intersectie.txt&#34;。

1 个答案:

答案 0 :(得分:3)

编辑 -

当我半睡半醒的时候,我在下面写道;-)并且这是你案件的一个很好的捷径

  sort -u -o file file

-u选项使排序数据为uniq,如下所述,-o file会将输出保存到您需要注意的任何文件中,包括与输入相同的名称。

如果你想做类似

的事情
  sort < file | uniq -c > uniqFileWithCounts

然后第一个想法不会帮助你。

即使您使用sort -o file file为排序的-o(utput)重用相同的文件名,也不要自欺欺人,系统必须在后台将所有数据写入一个tmp文件,然后重命名为-o file指定的文件(还排序是将中间排序数据写入/tmp目录并删除最终输出完成时的数据)。

所以你最好的选择就是

sort <reuniune1.txt | uniq > uniqd.txt && mv uniqd.txt reuniune1.txt 

如果sort | uniq进程退出且没有错误,则只会覆盖reuniune1.txt。

IHTH