awk: 太多输出文件 10 记录号 12

awk: too many output files 10 record number 12

我在尝试拆分文件时遇到问题。 谁能帮我解决这个问题?

示例内容:

apple fruit
goa   fruit
tomato vegetable
tiger  animal 

脚本:

 #!/bin/bash
 awk 'FNR==1 { hdr = [=11=]; next }
    {
        if(!f[]) { print hdr >"file" ".htm"; f[] = 1 }
        print >>"file" ".htm"
    }' samplefile.txt

能否请您尝试以下(未测试,因为未提供样品),如果太阳 o.s 使用 /usr/xpg4/bin/awk/usr/xpg6/bin/awk(请参阅此答案中的评论以获取更多详细信息也是)。

似乎 OP 使用的是旧的损坏的 awk,其中 close 函数无法使用以下解决方案,因此我建议 OP 使用 xpg awk(s),后来的 Ed先生也确认了。

#!/bin/bash
 awk 'FNR==1 { hdr = [=10=]; next }
    {
        if( != prev){close(file)}
        file="file"  ".htm"
        if(!f[]) {print hdr > file; f[] = 1 }
        print >> file
        prev=
    }' samplefile.txt

或尝试:

#!/bin/bash
 awk 'FNR==1 { hdr = [=11=]; next }
    {
        file="file"  ".htm"
        if(file!=prev){close(prev)}
        if(!f[]) {print hdr > file; f[] = 1 }
        print >> file
        prev=file
    }' samplefile.txt

你可能 运行 没有 FD,使用 close() 并尝试类似的东西:

$ awk '
FNR==1 {
    hdr = [=10=]
    next
}
{
    filename="file"  ".htm"
    if(!f[]) {
        print hdr >> filename
        f[] = 1
    }
    print >> filename
    close(filename)
}' file

哦,TIL:旧的 [Solaris] awk 没有关闭命令,甚至不够聪明,无法给出错误 "I don't know what close means".

如果您没有使用 GNU awk(它会在后台为您执行此操作),那么您需要手动关闭由于输入或输出重定向而打开的所有文件 - 您正在手动打开它们所以你需要手动关闭它们:

awk '
    FNR==1 { hdr = [=10=]; next }
     != prev {
        close(out)
        out = "file"  ".htm"
        if ( !seen[out]++ ) {
            print hdr > out
        }
        prev = 
    }
    { print >> out }
' samplefile.txt

希望通过拆分将每个字段 #1 分配给其对应的文件。 这是单行 awk 脚本:

awk ' in uniqSet == 0 {uniqSet[]=1;system("echo "" >> file"".htm");}' input

解释:

in uniqSet == 0 仅处理尚未处理的元素,元素不​​在 uniqSet 中。

uniqSet[]=1; 将 uniqSet 中的元素标记为处理。

system("echo "" >> file"".htm"); 执行 bash 命令“echo field#1 >> filefield#2.html