我有一个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
,但它不适用于空白值。我可以看到该列的文件类似于||
(两个管道之间没有任何内容)。
请帮我识别这些值并应用过滤器。
答案 0 :(得分:1)
使用$36 ~ /^$|0/
过滤零或空字符串。
答案 1 :(得分:1)
您可以使用以下条件进行过滤:
awk -F '|' '($36 ~ /^0?$/)' file
答案 2 :(得分: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", "", ""
}
}'
到目前为止,我假设您要打印,如果它不是第一行数据,$3
是A
,如果$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多列将小规模解决方案调整回您的真实案例。
答案 3 :(得分:1)
$36 !~ /^[0 ]*$/
应该执行您想要的操作,但如果条目的值为零(例如0.0
)则不匹配。为此,请尝试
$36 && $36 !~ /^[0 ]*$/