linux 我如何检查是否有重复的值跨文件在特定的位置

oyxsuwqo  于 2023-11-17  发布在  Linux
关注(0)|答案(3)|浏览(97)

我在Linux服务器上的目录中有大约2000个文件。在每个文件中,位置x-y都有发票编号。检查这些文件是否重复并打印文件名和值的最佳方法是什么?问题的简化版本-

$ cat a.txt 
xyz1234
xyz1234
pqr4567
$ cat b.txt 
lon9876
lon9876
lon4567

字符串
在上面的2个文件中,假设Invoice编号在4-8的位置,我们有重复的-“4567”在a.txt和b.txt中。如果我们在同一个文件中有重复的-因为我们在a.txt中有1234,这是好的。不需要打印。我试图剪切invy编号,但输出没有文件名。我的计划是剪切,得到文件名也沿着与发票号码,做一个唯一的输出等。

v2g6jxz6

v2g6jxz61#

Perl来救援!

perl -lne '
    $in_file{ substr $_, 3, 4 }{$ARGV} = 1;
    END {
        for $invoice (%in_file) {
            print join "\t", $invoice, keys %{ $in_file{$invoice} }
                if keys %{ $in_file{$invoice} } > 1;
        }
    }
' -- *txt

字符串

  • -n逐行读取输入文件,为每一行运行代码;
  • -l从输入中删除换行符,并将其添加到print艾德化的行中;
  • $ARGV包含当前打开文件的名称;
  • 我们建立一个哈希的哈希,第一级密钥是发票号,第二级密钥是它被发现的文件;
  • 发票号提取详见substr;
  • 在所有输入结束时,我们打印具有多个与其相关联的文件的键(即发票编号)。
tcomlyy6

tcomlyy62#

作为替代,这里有一个Ruby来做这件事:

ruby -lne 'BEGIN{files=Hash.new {|h,k| h[k] = Set.new()} }
files[$_[3..6]]<<$<.file.path
END{
    files.each{|inv,names| puts "#{inv}=>#{names.join","}" if names.length>1} 
}
' a.txt ba.txt

字符串
或者使用GNU awk(用于ENDFILE模式),您可以:

gawk '
BEGIN { FS = OFS = "," }

FNR == 1 { split("", fn, FS) } # clear array

{
    key = substr($0, 4, 4)
    if (! (key in fn)) {
        fn[key]
    }
}

ENDFILE {
    for (e in fn) {
        idx[e] = idx[e] ? idx[e] OFS FILENAME : FILENAME
    }
}

END {
    for (e in idx) {
        n = split(idx[e], a, FS)
        if (n > 1) {
            print e "=>" idx[e]
        }
    }
}
' *.txt


对于该示例,可以打印:

4567=>a.txt,ba.txt

l7wslrjt

l7wslrjt3#

这可能对你有用(GNU sed,sort,uniq,.):

echo *.txt |
xargs -n1 sed -E 's/...(.*)/\1 &/p;F;d' |
sed 'N;s/\n/ /' |
sort -u -k1n -k3 |
uniq -w4 -D

字符串
回显文件名。
使用xargs对每个文件应用sed脚本,将发票一分为二,并附加文件名。
使用sed将发票连接到文件名。
对结果进行排序,删除同一文件的重复项。
仅打印发票/文件名顺序中重复的发票。

相关问题