1

我有一个 txt 文件,其中有许多用管道分隔的列。我想检查列$36是否为“0”、null 或空白,然后过滤整行。

awk -F"|" 'BEGIN{OFS="|"} NR!=1, $3="A" && $36!=0 && length($36)>0
{print $1, $81, $3, $2, $21, $22, $6, $19, $20, $25, $26, $29, $30,
$31, $33, $34, $36, $38, "", $39, "", "", $40, $42, "rrr", "", "" }'

我尝试使用length($36)>0但它不适用于空白值。我可以看到该列的文件是这样的||(两个管道之间没有任何东西)。

请帮助我识别这些值并应用过滤器。

4

4 回答 4

1
$36 !~ /^[0 ]*$/

0.0应该做你想做的事,但如果条目的值为零(例如),则它不匹配。为此,请尝试

$36 && $36 !~ /^[0 ]*$/
于 2012-06-07T18:48:27.330 回答
1

用于$36 ~ /^$|0/过滤零或空字符串。

于 2012-06-07T15:39:33.927 回答
1

您可以使用以下条件进行过滤:

awk -F '|' '($36 ~ /^0?$/)' file
于 2012-06-07T15:39:45.673 回答
1

您可以通过使用更多的垂直空间来稍微简化代码。你的情况有一个令人费解的逗号;我想应该应该是一个&&。如图所示,您有一个没有操作的条件(因此有一个 print 的默认操作$0)和一个没有条件的操作(因此每行都有一个默认匹配)。

awk -F"|" 'BEGIN{OFS="|"}
    NR != 1 && $3 = "A" && $36 != 0 && length($36) > 0 {
       print $1, $81, $3, $2, $21, $22, $6, $19, $20, $25, $26, $29, $30,
             $31, $33, $34, $36, $38, "", $39, "", "", $40, $42, "rrr", "", ""
    }'

请注意, 与{条件在同一行。就个人而言,我可能会写成:

awk -F"|" 'BEGIN{OFS="|"}
    {
        if (NR != 1 && $3 = "A" && $36 != 0 && length($36) > 0)
        {
            print $1, $81, $3, $2, $21, $22, $6, $19, $20, $25, $26, $29, $30,
                  $31, $33, $34, $36, $38, "", $39, "", "", $40, $42, "rrr", "", ""
        }
    }'

到目前为止,我假设您要打印如果它不是第一行数据,如果$3A,并且如果$36既不是空也不是零。您说“我要过滤”,但这并不能解释您是要包含还是排除过滤的行。如果您只关心字段 36 为空的行,您可以将条件简化为:

awk -F"|" 'BEGIN{OFS="|"}
    {
        if (NR != 1 && $3 = "A" && $36 != "")
        {
            print $1, $81, $3, $2, $21, $22, $6, $19, $20, $25, $26, $29, $30,
                  $31, $33, $34, $36, $38, "", $39, "", "", $40, $42, "rrr", "", ""
        }
    }'

或者你可以只使用length($36) > 0;在这种情况下它们是等价的。

鉴于您没有提供任何示例数据,而且我也懒得去计算具有 81 个或更多管道分隔字段的记录是什么样的,因此我无法测试此代码。问一个问题时,你应该简化你的代码;例如,在一个示例中,您可以使用 4 列,然后将小规模解决方案调整回具有 80 多列的实际案例。

于 2012-06-07T15:49:06.677 回答