首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >awk:过多的输出文件,10个记录编号12

awk:过多的输出文件,10个记录编号12
EN

Stack Overflow用户
提问于 2019-04-08 14:52:51
回答 4查看 195关注 0票数 0

我在试图拆分文件时遇到了问题。有人能帮我吗?

样本内容:

代码语言:javascript
复制
apple fruit
goa   fruit
tomato vegetable
tiger  animal 

剧本:

代码语言:javascript
复制
 #!/bin/bash
 awk 'FNR==1 { hdr = $0; next }
    {
        if(!f[$2]) { print hdr >"file" $2".htm"; f[$2] = 1 }
        print >>"file" $2".htm"
    }' samplefile.txt
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-04-08 14:56:22

如果sun o.s使用/usr/xpg4/bin/awk/usr/xpg6/bin/awk(请参阅本答案中的评论以获得更多详细信息),请您尝试以下操作(因为没有给出样本)。

好像OP使用的是旧的、坏掉的awk,其中close函数不能按照下面的解决方案工作,所以我建议OP使用xpg awk,后来Ed也证实了这一点。

代码语言:javascript
复制
#!/bin/bash
 awk 'FNR==1 { hdr = $0; next }
    {
        if($2 != prev){close(file)}
        file="file" $2 ".htm"
        if(!f[$2]) {print hdr > file; f[$2] = 1 }
        print >> file
        prev=$2
    }' samplefile.txt

或尝试:

代码语言:javascript
复制
#!/bin/bash
 awk 'FNR==1 { hdr = $0; next }
    {
        file="file" $2 ".htm"
        if(file!=prev){close(prev)}
        if(!f[$2]) {print hdr > file; f[$2] = 1 }
        print >> file
        prev=file
    }' samplefile.txt
票数 1
EN

Stack Overflow用户

发布于 2019-04-08 15:13:21

您可能已经用完了FDs,使用close()并尝试如下所示:

代码语言:javascript
复制
$ awk '
FNR==1 {
    hdr = $0
    next
}
{
    filename="file" $2 ".htm"
    if(!f[$2]) {
        print hdr >> filename
        f[$2] = 1
    }
    print >> filename
    close(filename)
}' file

哦,TIL:旧的Solaris awk没有关闭命令,甚至没有足够聪明到说“我不知道关闭”的错误。

票数 0
EN

Stack Overflow用户

发布于 2019-04-08 15:46:21

如果您没有使用GNU awk (在后台为您这样做),那么您需要手动关闭由于输入或输出重定向而打开的任何文件--您正在手动打开它们,因此需要手动关闭它们:

代码语言:javascript
复制
awk '
    FNR==1 { hdr = $0; next }
    $2 != prev {
        close(out)
        out = "file" $2 ".htm"
        if ( !seen[out]++ ) {
            print hdr > out
        }
        prev = $2
    }
    { print >> out }
' samplefile.txt
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55576187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档