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

时间:2019-04-08 14:52:51

标签: linux file unix awk sunos

尝试分割文件时出现问题。 有人可以帮我吗?

样本内容:

apple fruit
goa   fruit
tomato vegetable
tiger  animal 

脚本:

 #!/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

4 个答案:

答案 0 :(得分:1)

如果太阳晒太阳,请使用/usr/xpg4/bin/awk/usr/xpg6/bin/awk(请参阅此答案中的注释以获取更多详细信息)。 >

好像OP正在使用OLD损坏的awk,其中close函数在以下解决方案中不起作用,因此我建议OP使用xpg awk,稍后Ed先生确认那也是。

#!/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

或尝试:

#!/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 :(得分:0)

您可能用完了FD,请使用close()并尝试以下操作:

$ 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没有close命令,甚至还不够聪明,无法发出错误消息“我不知道关闭意味着什么”。 < / p>

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

说明:

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

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

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