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

时间:2015-07-01 14:36:04

标签: awk

我有一个包含多个文件的文件夹,我希望使用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 }
' *

文件中的信息示例如下:

File1中

3   coffee  
4   and  
8   milk  

文件2

4   dog  
2   and  
9   cat  

输出应为:

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

当我使用大量文件时,错误发生在哪里?

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

1 个答案:

答案 0 :(得分:1)

使用>时,会打开一个文件进行写入(并截断)。正如评论中所建议的那样,您需要在进行中关闭文件。尝试这样的事情:

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 }
' *