多个if条件AWK

1 bash awk if-statement

我有一个非常大的文件与德国邮政编码/ zipcodes.对于每个代码,我想找到正确的联邦州.我做的是以下.

  1. 我在一个新文件中打印了zipcodes.
  2. 我对它们进行了分类,并将双重案例踢出.现在我有了一个包含2267种不同邮政编码的新文件.
  3. 我创建了一个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...
Run Code Online (Sandbox Code Playgroud)

所以我认为我只得到一个zipcode的名称(如果它落在条件的范围内).这意味着我的新文件中应该有2267个案例.但是,我的新文件为23k案例.

我想知道,如果邮政编码属于多个范围......你有什么想法,为什么邮政编码可以适应几种情况?我想让每个邮政编码完全匹配一个条件.

Win*_*ute 6

由于我不知道整个脚本或整个输入数据,因此很难肯定地说,但我强烈怀疑它与您无意中使用八进制数有关.在awk中,0以及不包含8或者9是八进制数字的文字,也就是说010 == 8,0100 == 64等等.有关详细信息,请参阅此处.

当你写作

{if ($1 >= 01001 && $1 <=01936)
Run Code Online (Sandbox Code Playgroud)

那么01001是一个八进制数,01936是一个十进制数(至少有GNU awk,因为它包含一个9),所以你问是否$1 >= 513 && $1 <= 1936.

我怀疑是你以这种方式构造了重叠范围,并且可以通过从所有条件中删除前导零来解决问题(因为八进制解释不适用于输入数据).

顺便说一下,写起来可能会更加笨拙

$1 >= 1001 && $1 <= 1936 { print "Sachsen" > "PLZ6.txt" }
Run Code Online (Sandbox Code Playgroud)

等等.