我有一个包含多个文件的文件夹,我希望使用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
当我使用大量文件时,错误发生在哪里?
我的主要目标是在文件夹中的所有文件上运行此脚本,以生成不包含文件夹中所有文件中出现的任何单词的新文件。
答案 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 }
' *