在awk中搜索空值

在awk中搜索空值,awk,Awk,我有一个txt文件,其中有许多列是以管道分隔的。我想检查列$36是否为“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,

我有一个txt文件,其中有许多列是以管道分隔的。我想检查列
$36
是否为“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", "", "" }'
我尝试使用
length($36)>0
,但它不适用于空白值。我可以看到该列中的文件是这样的
|
(两个管道之间没有任何内容)


请帮助我识别这些值并应用筛选器。

使用
$36~/^$| 0/
筛选零或空字符串。

使用
$36~/^$| 0/
筛选零或空字符串。

您可以使用以下条件进行筛选:

awk -F '|' '($36 ~ /^0?$/)' file

您可以使用以下条件筛选is:

awk -F '|' '($36 ~ /^0?$/)' file

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

请注意,
{
与条件位于同一行。我个人可能会这样写:

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", "", ""
        }
    }'
到目前为止,我假设如果不是第一行数据,如果
$3
A
,如果
$36
既不是空的也不是零,那么您想要打印。您说“我想要筛选”,但这并不能解释您是否想要包括或排除筛选的行。如果您只关心字段36为空的行,那么u可以将条件简化为:

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列,例如,在一个示例中,然后将小规模解决方案调整回实际的case有80多个列。

您可能会通过使用更多的垂直空间来简化代码。您的条件中有一个逗号,这令人费解;我认为它可能是一个
&
。如图所示,您有一个没有操作的条件(因此有一个默认操作print
$0
),还有一个没有条件的操作(因此每行都有一个默认匹配)

$36 !~ /^[0 ]*$/
请注意,
{
与条件位于同一行。我个人可能会这样写:

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", "", ""
        }
    }'
到目前为止,我假设如果不是第一行数据,如果
$3
A
,如果
$36
既不是空的也不是零,那么您想要打印。您说“我想要筛选”,但这并不能解释您是否想要包括或排除筛选的行。如果您只关心字段36为空的行,那么u可以将条件简化为:

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列,例如,在一个示例中,然后将小规模解决方案调整回实际的case具有80多个列

$36 !~ /^[0 ]*$/
应该执行您想要的操作,但是如果条目具有零值(例如
0.0
),则不匹配。为此,请尝试

$36 && $36 !~ /^[0 ]*$/
应该执行您想要的操作,但是如果条目具有零值(例如
0.0
),则不匹配。为此,请尝试

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

它不删除您尝试的空白记录扫描:<代码> AWK-F′′($ 36 /^*$ 0 /)文件< >代码>它不删除您尝试的空白记录扫描:<代码> AWK-F′′($ 36 ~/^*$ 0 /)文件< <代码> >它不删除空白值i(两个管道之间没有任何东西)是否有可能在我看不到的东西之间有某种价值?它没有去除空白值(两个管道之间没有任何东西)。有可能在我看不到的东西之间有一些价值吗?