2015-07-01 29 views
1

我有一个文件夹,其中包含几个文件,我想要使用它们排除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 } 
' * 

在文件中的信息的一个例子是:

文件1

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 

,其中从当我使用较大量的文件来的错误?

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

+2

你需要关闭()你的文件,当你完成它们。正如你携带你永远打开的每个文件一样。 –

回答

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

你可能在没有'if(outfile)'的情况下离开,它看起来更干净。 –

相关问题