awk:运行时错误:负字段索引$-1

awk:运行时错误:负字段索引$-1,awk,Awk,我试图打印第一列和(如果存在)最后第二列,但有时正在处理的行只有一列 例如: host1, auth ldap system-auth { bind-dn CN=xx-w-xx,OU=iResources,DC=int,DC=dir,DC=dimsum,DC=com bind-pw xxxxx login-attribute samaccountname search-base-dn ou=wbab,dc=int,dc=dir,dc=dodo,dc=com servers { 10.10.10.

我试图打印第一列和(如果存在)最后第二列,但有时正在处理的行只有一列

例如:

host1, auth ldap system-auth { bind-dn CN=xx-w-xx,OU=iResources,DC=int,DC=dir,DC=dimsum,DC=com bind-pw xxxxx login-attribute samaccountname search-base-dn ou=wbab,dc=int,dc=dir,dc=dodo,dc=com servers { 10.10.10.1 } }
host2
我试过:

`awk '{print $1, $(NF-2) ? $(NF-2) : "None" }'`
我在处理第二行时出错:

host1, 10.10.10.1
awk: run time error: negative field index $-1

我们如何处理负面或不存在的字段?

您很接近。这应该做到:

awk '{print $1,(NF>2?$(NF-2):"None")}' file
host1, 10.10.10.1
host2 None

它测试字段数是否大于两个。您确实检查了最后一个字段-2中是否有数据,如果该字段不存在,它将失败。此外,您还应该在三元运算符(
expr1?expr2:expr3
)周围使用括号。

您可能只想先保持简单。可读且可理解的实现如下:

awk '{if(NF==1){print $1} else { print $1, $(NF-2)}}' file
但别误会,我不是说不应该使用较短的版本。我会用。但有时最好从一个简单、明确的实现开始,然后从那里减少它