1

这很令人困惑,所以我将展示我构建问题的所有步骤:

awk 'BEGIN { FS == /\s\s\s\s/ } ; 
    {
    if ( NF == 0 )
        next
    else
        {{ print "-------------NR = " NR "-----------------------NF = " NF }
        for (i = 0; i <= NF; i++)
            {{ print ( i, $i )}    }
        }
    }' 200_Undercounter_Series.txt > new.txt

产生期望的结果(我只包括了相关的记录):

-------------NR = 9-----------------------NF = 7
0                                 1.         3510090               Shelf Guard  (See SN Breaks)
1 1.
2 3510090
3 Shelf
4 Guard
5 (See
6 SN
7 Breaks)
-------------NR = 10-----------------------NF = 6
0                                      3515980               Shelf Guard  (See SN Breaks)
1 3515980
2 Shelf
3 Guard
4 (See
5 SN
6 Breaks)

请注意记录 9 的字段 1 和 2 的值,以及记录 10 的字段 1。我希望将这 2 条记录与文件的其余部分分开,因此我将记录 9 的字段 2 的值划分为:

if ( NF == 0 )
    next
else
    {{ print "-------------NR = " NR "-----------------------NF = " NF }
    for (i = 0; i <= NF; i++)
        {if ( $2 = /[0-9][0-9][0-9][0-9][0-9][0-9][0-9]/)
            { print ( ">>", i, $i)}
        else
            { print ( i, $i )}
        }
    }
}' 200_Undercounter_Series.txt > new.txt

我收到这些结果:

-------------NR = 9-----------------------NF = 7
>> 0 1. 1 Shelf Guard (See SN Breaks)
1 1.
2 0
3 Shelf
4 Guard
5 (See
6 SN
7 Breaks)
-------------NR = 10-----------------------NF = 6
>> 0 3515980 1 Guard (See SN Breaks)
>> 1 3515980
>> 2 1
>> 3 Guard
>> 4 (See
>> 5 SN
>> 6 Breaks)

请注意,不仅“>>”指示符在未指定的记录中($2 = /regex/),而且记录 9 中的字段 2 现在 = 0!!!

此时我的程序中没有其他代码。我在这里想念什么?

谢谢

4

2 回答 2

3

您分配给 $2

    {if ( $2 = /[0-9][0-9][0-9][0-9][0-9][0-9][0-9]/)
             ^

您想要正则表达式运算符

    {if ( $2 ~ /[0-9][0-9][0-9][0-9][0-9][0-9][0-9]/)
             ^
于 2013-09-13T20:39:49.597 回答
2

我在您的代码中看到的两个问题:

  • BEGIN { FS == /\s\s\s\s/ }应该FS='.....'
  • 在您的 if 语句中,if ($2 = /[0-9]..../)您实际上想要if($2~/[0-9].../)

==用于检查左右部分是否相等。

=是变量赋值。

~用于正则表达式匹配。

于 2013-09-13T20:42:48.993 回答