使用awk消除文件夹中所有文件中出现的所有值

使用awk消除文件夹中所有文件中出现的所有值,awk,Awk,我有一个文件夹,其中有几个文件,我想使用awk删除它们的所有共同术语。 以下是我一直在使用的脚本: awk ' FNR==1 { if (seen[FILENAME]++) { firstPass = 0 outfile = FILENAME "_new" } else { firstPass = 1 numFiles++ ARGV[ARGC++] = FILE

我有一个文件夹,其中有几个文件,我想使用
awk
删除它们的所有共同术语。 以下是我一直在使用的脚本:

awk '                
FNR==1 {
    if (seen[FILENAME]++) {
        firstPass = 0
        outfile = FILENAME "_new"
    }
    else {
        firstPass = 1
        numFiles++
        ARGV[ARGC++] = FILENAME
    }
}
firstPass { count[$2]++; next }
count[$2] != numFiles { print > outfile }
' *
文件中的信息示例如下:

文件1

文件2

输出应为:

File1_new

    3   coffee   
    8   milk  

File2_new

    4   dog  
    9   cat 
当我使用少量文件(即10个)时,它可以工作,但当我开始增加该数量时,我会收到以下错误消息:

awk: file20_new makes too many open files  input record number 27, file file20_new  source line number 14
当我使用大量文件时,错误来自哪里


我的主要目标是在文件夹中的所有文件上运行此脚本,以生成不包含文件夹中所有文件中出现的任何单词的新文件。

使用
时,将打开一个文件进行写入(并截断)。正如评论中所建议的,您需要在继续操作时关闭文件。试着这样做:

awk '                
FNR==1 {
    if (seen[FILENAME]++) {
        firstPass = 0
        if (outfile) close(outfile) # <-- close the previous file
        outfile = FILENAME "_new"
    }
    else {
        firstPass = 1
        numFiles++
        ARGV[ARGC++] = FILENAME
    }
}
firstPass { count[$2]++; next }
count[$2] != numFiles { print > outfile }
' *
awk'
FNR==1{
如果(见[FILENAME]++){
首次通过=0
如果(输出文件)关闭(输出文件)#输出文件}
' *

处理完文件后,你需要
关闭()
你的文件。就像你永远随身携带打开的每个文件一样。你可能不需要
if(outfile)
,它看起来更干净。
awk: file20_new makes too many open files  input record number 27, file file20_new  source line number 14
awk '                
FNR==1 {
    if (seen[FILENAME]++) {
        firstPass = 0
        if (outfile) close(outfile) # <-- close the previous file
        outfile = FILENAME "_new"
    }
    else {
        firstPass = 1
        numFiles++
        ARGV[ARGC++] = FILENAME
    }
}
firstPass { count[$2]++; next }
count[$2] != numFiles { print > outfile }
' *