Bash 多if条件AWK

Bash 多if条件AWK,bash,if-statement,awk,Bash,If Statement,Awk,我有一个很大的德国邮政编码文件。对于每个代码,我想找到正确的联邦州。我所做的如下 我在一个新文件中打印了Zipcode 我把它们整理好,扔掉了两个箱子。 现在我有了一个包含2267个不同Zipcode的新文件 我创建了一个awk命令,它应该为每个代码找到一个名称 看起来像这样: {if ($1 >= 01001 && $1 <=01936) print "Sachsen" >"PLZ6.txt"} {if ($1 >= 01941 &&

我有一个很大的德国邮政编码文件。对于每个代码,我想找到正确的联邦州。我所做的如下

  • 我在一个新文件中打印了Zipcode
  • 我把它们整理好,扔掉了两个箱子。 现在我有了一个包含2267个不同Zipcode的新文件
  • 我创建了一个awk命令,它应该为每个代码找到一个名称
  • 看起来像这样:

    {if ($1 >= 01001 && $1 <=01936) 
    print "Sachsen" >"PLZ6.txt"} 
    {if ($1 >= 01941 && $1 <= 01998) 
    print "Brandenburg" >"PLZ6.txt"}
    {if ($1 >= 02601 && $1 <= 02999)
    print "Sachsen" >"PLZ6.txt"}
    {if ($1 >= 03001 && $1 <= 03253)
    print "Brandenburg" >"PLZ6.txt"} #this goes on for another 150 different lines...
    
    {if($1>=01001&&$1“PLZ6.txt”}
    {如果($1>=01941&&$1“PLZ6.txt”}
    {如果($1>=02601&&$1“PLZ6.txt”}
    {如果($1>=03001&&$1“PLZ6.txt”}#这将继续用于另外150个不同的行。。。
    
    因此,我认为我的一个zipcode(如果它在条件范围内的话)只有一个名称。这意味着我的新文件中应该有2267个案例。然而,我的新文件是23k案例


    我想知道,如果邮政编码分为多个范围……你知道吗,为什么zipcode可以符合几个条件?我想让每个zipcode恰好匹配一个条件。

    很难确定,因为我不知道整个脚本或整个输入数据,但我强烈怀疑它与你的u八进制数的常规用法。在awk中,以
    0
    开头且不包含
    8
    9
    的文字是八进制数,也就是说
    010==8
    0100==64
    等。有关详细信息,请参阅

    当你写作时

    {if ($1 >= 01001 && $1 <=01936)
    

    等等。

    很难确定,因为我不知道整个脚本或整个输入数据,但我强烈怀疑这与您无意中使用八进制数有关。在awk中,以
    0
    开头且不包含
    8
    9
    的文字是八进制数,也就是说
    010==8
    0100==64
    等。有关详细信息,请参阅

    当你写作时

    {if ($1 >= 01001 && $1 <=01936)
    

    依此类推。

    如果我是对的,包含postalcode的文件应该如下所示:

    01001 City-Name Sachsen
    01936 City-Name Sachsen
    02601 City-Name Sachsen
    02602 City-Name Sachsen
    02603 City-Name Sachsen
    02604 City-Name Sachsen
    02999 City-Name Sachsen
    01941 City-Name Brandenburg
    01942 City-Name Brandenburg
    01943 City-Name Brandenburg
    01944 City-Name Brandenburg
    01945 City-Name Brandenburg
    01998 City-Name Brandenburg
    03001 City-Name Brandenburg
    03253 City-Name Brandenburg
    
    这里将
    城市名称
    替换为邮政编码的实际城市名称

    $ awk '/01945/ {print $3}' postalcodes.txt
    Brandenburg
    

    这应该会给你联邦政府。这解决了你的问题吗?

    如果我是对的,包含postalcode的文件应该如下所示:

    01001 City-Name Sachsen
    01936 City-Name Sachsen
    02601 City-Name Sachsen
    02602 City-Name Sachsen
    02603 City-Name Sachsen
    02604 City-Name Sachsen
    02999 City-Name Sachsen
    01941 City-Name Brandenburg
    01942 City-Name Brandenburg
    01943 City-Name Brandenburg
    01944 City-Name Brandenburg
    01945 City-Name Brandenburg
    01998 City-Name Brandenburg
    03001 City-Name Brandenburg
    03253 City-Name Brandenburg
    
    这里将
    城市名称
    替换为邮政编码的实际城市名称

    $ awk '/01945/ {print $3}' postalcodes.txt
    Brandenburg
    

    这应该给你一个联邦政府。这解决了你的问题吗?

    @Wintermute可能是正确的,请回答八进制猜测。如果是这样,接受他的答案,但无论如何,请将代码改写为:

    function m(beg,end,state) {
        if ( ($1 >= beg) && ($1 <= end) ) {
            if ($1 in states) {
                printf "Warning: State for zip \"%s\" being changed from \"%s\" to \"%s\".\n", $1, states[$1], state| "cat>&2"
            }
            states[$1] = state
            print state > "PLZ6.txt"
        }
    }
    {
        m(1001,1936,"Sachsen") 
        m(1941,1998,"Brandenburg")
        m(2601,2999,"Sachsen")
        m(3001,3253,"Brandenburg")
    }
    

    @Wintermute的八进制猜测可能是正确的。如果是,请接受他的答案,但无论如何,请将代码改写为:

    function m(beg,end,state) {
        if ( ($1 >= beg) && ($1 <= end) ) {
            if ($1 in states) {
                printf "Warning: State for zip \"%s\" being changed from \"%s\" to \"%s\".\n", $1, states[$1], state| "cat>&2"
            }
            states[$1] = state
            print state > "PLZ6.txt"
        }
    }
    {
        m(1001,1936,"Sachsen") 
        m(1941,1998,"Brandenburg")
        m(2601,2999,"Sachsen")
        m(3001,3253,"Brandenburg")
    }
    

    您好,欢迎来到StackOverflow。这里是大多数用户可能会同意该网站的工作方式:您不需要事先打招呼或感谢,避免使用这些词语会使您的问题更容易扫描,以便正确的人能够回答(而且,几个月后,当其他人遇到同样的问题并阅读您的问题时,这些词语也没有意义)。如果你的问题是关于主题的,你不必为此道歉。如果不是关于主题的,社区会让你知道。您好,欢迎来到StackOverflow。以下是大多数用户可能会同意该网站的工作方式:你不必事先打招呼或感谢,避免使用这些词会使你的问题更易于扫描,以便浏览ht人可以回答它(而且,几个月后,当其他人有同样的问题并阅读你的问题时,他们也没有意义)。如果你的问题是关于主题的,你不需要为提问道歉。如果不是关于主题的,社区会让你知道。那人真的做到了!谢谢你!那人真的做到了!谢谢你!