Windows 从txt文件中查找相似的数字,并将匹配的数字行保存在不同的txt文件中

Windows 从txt文件中查找相似的数字,并将匹配的数字行保存在不同的txt文件中,windows,batch-file,awk,Windows,Batch File,Awk,主文本(data.txt)包含例如: Lib ID 4444 QT ID 4444 SOQ ID 80 MAC ID 21563 LED ID 4444 TRD ID 80 CAD ID 31256 OIL ID 21563 MNO ID 3315 TOP ID 638 这一清单还在继续。数字的最小值为2到5位。我试图做的是匹配相同的数字,并将它们保存在单独的txt文件中。这些文件可以按数字的名称保存,也可以是任意数字。例如,它会将以下ID保存在单独的txt文件(4444.txt或random

主文本(data.txt)包含例如:

Lib ID 4444
QT ID 4444
SOQ ID 80
MAC ID 21563
LED ID 4444
TRD ID 80
CAD ID 31256
OIL ID 21563
MNO ID 3315
TOP ID 638
这一清单还在继续。数字的最小值为2到5位。我试图做的是匹配相同的数字,并将它们保存在单独的txt文件中。这些文件可以按数字的名称保存,也可以是任意数字。例如,它会将以下ID保存在单独的txt文件(4444.txt或random.txt)中:

它将在不同的txt中保存80:

TRD ID 80
SOQ ID 80
OIL ID 21563
MAC ID 21563
在不同的txt中保存另一个匹配项:

TRD ID 80
SOQ ID 80
OIL ID 21563
MAC ID 21563
具有唯一编号的行将保存在不同的txt中,例如(unique.txt):

我已尝试使用此正则表达式:
(\d)(?!\1+$)\d*


它与相似的数字匹配,但我一直坚持将它们分开。非常感谢您的帮助。

对于您展示的样品,请尝试以下内容。使用GNU
awk
编写和测试

awk '
FNR==NR{
  arr[$NF]++
  next
}
arr[$NF]==1{
  print > ("unique.txt")
  next
}
arr[$NF]>1{
  outFile=$NF".txt"
  print >> (outFile)
  close(outFile)
}
'  Input_file Input_file
说明:添加上述内容的详细说明

awk '                       ##Starting awk program from here.
FNR==NR{                    ##Checking condition which will be TRUE when Input_file is being read first time.
  arr[$NF]++                ##Creating arr with index of last field and increasing it 1 each time it comes with same one.
  next                      ##next will skip all further statements from here.
}
arr[$NF]==1{                ##Checking condition if any value(last field) occurs only 1 time in whole Input_file then do following.
  print > ("unique.txt")    ##Printing current line to unique.txt output file.
  next                      ##next will skip all further statements from here.
}
arr[$NF]>1{                 ##Checking condition if last field comes more than 1 then do following.
  outFile=$NF".txt"         ##Creating outFile variable with last field .txt to it.
  print >> (outFile)        ##Printing current line to output file here.
  close(outFile)            ##Closing output file in backend to avoid "too many opened files" error.
}
'  Input_file Input_file    ##Mentioning Input_file(s) here.

另一个创建名为
1
的文件的awk<代码>n(代码中的变量<代码>f):

$awk-f tst.awk文件
$head*.txt
==>21563.txt 4444.txt 80.txt unique.txt
@ECHO OFF
SETLOCAL
rem源目录、目标目录、目标目录的以下设置,
rem批处理目录、文件名、输出文件名和临时文件名[如果显示]是名称
我用于测试的rem,故意包含包含空格的名称,以确保
rem确认流程使用这些名称工作。这些将需要改变,以适应您的情况。
设置“sourcedir=u:\your files”
设置“destdir=u:\your results”
设置“filename1=%sourcedir%\q66304300.txt”
对于/f“usebackqtokens=1,2,*delims=“%%u IN”(“%filename1%”)DO(ECHO%%u%%v%%w)>%destdir%\%%w.txt”
对于('dir/b/a-d”%destdir%\*.txt“)中的/f%%e,请执行以下操作(
设置“多行=”
对于(“%destdir%\%%e”)中的/f“usebackqskip=1”%%b,请设置“多行=%%b”
如果未定义多行类型“%destdir%\%%e”>%destdir%\oncers.txt”&DEL“%destdir%\%%e”
)
后藤:EOF
从源文件的每一行中,选择3列中的每一列,分别添加到假定为空的目标目录中的文件名(第3列).txt


然后从目标目录中读取每个文件。如果它只有一行,那么将它附加到目标目录中的
oncers.txt
,并将其删除。

最好说明它是什么工具/语言(对我来说是基本的,但idk),以及如何在问题中的示例上执行它。自从我在-93年转用Linux之后,我真的没见过这么多。有头发和我的Windows 3.1:D@EdMorton:它是批处理的,就像标记列表中的一样。只需设置源和目标目录名以适应(OP)系统,并用文件的实际名称替换文件名。我使用一组目录进行测试,其中在名称中包含空格,以测试特定方面,这可能是一个绊脚石,并将OP的数据保存在名为
q?????
的文件中,其中
?????
是问题编号,以便我可以区分适用于每个解决方案的数据集。@JamesBrown是的,当我的高中有了第一台计算机,一台计算机时,BASIC是我学的第二门语言(在Fortran之后)。看起来很像这个答案IIRC中的代码,但已经40多年了,所以我可能记错了…@Magoo这批货做得很好。这对我来说非常有效。这个脚本很容易理解,我可以将目录和文件名设置为首选。我在windows上,因此使用批处理脚本更容易,并且与我的其他程序更兼容。其他脚本也很好,但这对我来说是最好的解决方案。谢谢你的帮助。这个脚本做得很好。我目前在windows上,所以批处理脚本对我来说更可取。你知道GNU awk也在windows上运行,对吗?不管怎样,你可以先考虑一下批处理脚本,然后再问其他语言,如果你不能得到这样的语言,那么人们就不会浪费时间在你不想使用的语言中发布脚本。让我改写一下,我觉得使用批处理比使用AWK更舒服。我的windows上确实安装了Gawk。我要求其他标签,因为我想有其他的选择来做这件事。您以前在windows上尝试过批处理脚本吗?它更容易理解和使用。而且它不需要像gawk这样的第三方程序。无论如何,谢谢你的时间和辛勤工作。它没有浪费,我发现你的脚本对Awk来说是最好的,我相信其他人也会觉得它很有用。谢谢你的帮助,但是,由于某些原因,它对我不起作用。在运行脚本之后,它不会做任何事情。我打赌你传递的文件名没有Ravinder显示的两倍。谢谢你。你能让它与Windows兼容吗?我运行了它,但似乎不起作用。嗯,它是您标记的awk,您需要安装awk来运行它。它怎么不起作用?您可以将实际的代码部分(单引号之间的代码)复制并粘贴到一个文件(稍后命名为
code.awk
)中,并使用
awk-f code.awk文件运行它
我实际上是在将整个内容复制到一个awk文件中,它给出了“.”语法错误。现在,它工作正常。我看到这些文件是用数字命名的。将数据中的数字作为文件名更有用。尽管如此,这也是可行的。谢谢你的帮助。我可能(显然)错过了文件命名要求,对此表示抱歉。我也从来没有读过任何设备的手册。。。我将在一点时间内解决这个问题(不是手动阅读部分)。
$ awk '{
    if(!($3 in a) && !($3 in u)) {
        u[$3]=$0
        next
    }
    if($3 in u) {                    # u hash holds uniques
        a[$3]=++f                    # file naming happens here
        print u[$3] >> a[$3]    
        print >> a[$3]
        close(a[$3])
        delete u[$3]                 # delete from unique hash when not unique anymore
        next
    }
    print >> a[$3]
    close(a[$3])
}
END {                                # in the end 
    f++
    for(i in u)                      # print all uniques to last file
        print u[i] > f
}' file
$ cat tst.awk
{
    if ( $3 in key2out ) {
        out = key2out[$3]
        if ( $3 in key2first ) {
            print key2first[$3] > out
            delete key2first[$3]
        }
        print >> out
        close(out)
    }
    else {
        key2out[$3] = $3 ".txt"
        key2first[$3] = $0
    }
}
END {
    for (key in key2first) {
        print key2first[key] > "unique.txt"
    }
}
$ awk -f tst.awk file
$ head *.txt
==> 21563.txt <==
MAC ID 21563
OIL ID 21563

==> 4444.txt <==
Lib ID 4444
QT ID 4444
LED ID 4444

==> 80.txt <==
SOQ ID 80
TRD ID 80

==> unique.txt <==
TOP ID 638
MNO ID 3315
CAD ID 31256