Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何保存文件';如果使用uniq命令(在shell中),是否使用s格式?_Unix_File_Shell_Sorting_Duplicates - Fatal编程技术网

Unix 如何保存文件';如果使用uniq命令(在shell中),是否使用s格式?

Unix 如何保存文件';如果使用uniq命令(在shell中),是否使用s格式?,unix,file,shell,sorting,duplicates,Unix,File,Shell,Sorting,Duplicates,为了使用uniq命令,必须首先对文件进行排序 但是在我拥有的文件中,信息的顺序很重要,因此我如何保持文件的原始格式,但仍能消除重复内容?您可以使用一些可怕的O(n^2)东西,如以下(伪代码): 这可能相当缓慢,尤其是在Bash级别实现时。但是,如果您的文件相当短,那么它可能工作得很好,并且可以很快实现(文件2中的不是line就是grep-v,依此类推) 否则,您当然可以编写一个专用程序,在内存中使用一些更高级的数据结构来加速它。您可以在文件的排序版本上运行uniq-d来查找重复的行,然后运行一些

为了使用uniq命令,必须首先对文件进行排序


但是在我拥有的文件中,信息的顺序很重要,因此我如何保持文件的原始格式,但仍能消除重复内容?

您可以使用一些可怕的O(n^2)东西,如以下(伪代码):

这可能相当缓慢,尤其是在Bash级别实现时。但是,如果您的文件相当短,那么它可能工作得很好,并且可以很快实现(文件2中的
不是line
就是
grep-v
,依此类推)


否则,您当然可以编写一个专用程序,在内存中使用一些更高级的数据结构来加速它。

您可以在文件的排序版本上运行uniq-d来查找重复的行,然后运行一些脚本,其中说明:

if this_line is in duplicate_lines {
    if not i_have_seen[this_line] {
        output this_line
        i_have_seen[this_line] = true
    }
} else {
    output this_line
}

awk
保留第一次出现。与其他答案使用的算法相同:

awk '!($0 in lines) { print $0; lines[$0]; }'
这里有一个只需要使用
awk
存储重复的行(与所有行相反):

sort file | uniq -d | awk '
   FNR == NR { dups[$0] }
   FNR != NR && (!($0 in dups) || !lines[$0]++)
' - file
首先做这类工作

对于每个uniqe值,第一次匹配的grep(-m1)

并保留行号

按行号对输出进行数字排序(-n)

然后可以使用sed或awk删除行#

另一个awk版本:

awk '!_[$0]++' infile
还有“行号,双重排序”方法


仅使用uniq和grep:

创建d.sh:

#!/bin/sh
sort $1 | uniq > $1_uniq
for line in $(cat $1); do
cat $1_uniq | grep -m1 $line >> $1_out
cat $1_uniq | grep -v $line > $1_uniq2
mv $1_uniq2 $1_uniq
done;
rm $1_uniq
./d.sh infile
示例:

#!/bin/sh
sort $1 | uniq > $1_uniq
for line in $(cat $1); do
cat $1_uniq | grep -m1 $line >> $1_out
cat $1_uniq | grep -v $line > $1_uniq2
mv $1_uniq2 $1_uniq
done;
rm $1_uniq
./d.sh infile

是否只保留图案的第一个匹配项?还是只有最后一个?你必须比这更具体一点…文件是这样的。模式1模式2模式3模式4模式1模式2等。。。模式1不同于模式2,依此类推。pattern1是标题,pattern2是电话号码。如果我对文件进行排序,电话号码将不在正确的标题下,等等。我忘记了此评论部分不保留格式。所以上面的帖子可能有点难理解,答案很多。吃完午饭回来后,我会检查一下,然后选择一个最好的答案。谢谢,伙计们,谢谢放松。我现在的文件只是一个示例文件,所以它很短。但是我将使用它的文件将会很大。我会看看其他人的建议,现在我可能会试试你的建议。与稍微简单的解决方案相比,这样做的好处是,你没有保留文件中每一行的映射,只有重复的行。哦,等等。没有想到-d。愚蠢的利特。好的,可以删掉comm,然后支持它:)在放入-d之后的最终版本,而不是使用comm:sort file.txt | uniq-d | awk'FNR==NR{dups[$0];}FNR=NR{if($0在DUP中){if(!($0在lines中)){print$0;lines[$0];}}}否则仅当第一次看到时才打印$0;}'-file.txtPrint。+1用于处理非常大文件的解决方案。但这不应该是“sort-k1n”(数字排序)吗?
./d.sh infile