awk:检查字段的长度

awk:检查字段的长度

awk。我正在使用 Solaris 10,因此它可能是旧版本的awk.我想出了这个基本的俏皮话,至少对于我的特定输入来说是有效的。

awk -F\; '$3 ~ /[ ]*...............................*/' file.csv 

分隔符周围可能有也可能没有空格,因此是[ ]*正则表达式的一部分。

想要避免打印 30 次点.字符,我尝试了以下操作:

awk -F\; '$3 ~ /[ ]*.\{30\}.*/{print $3}' file.csv

这没有返回任何结果。如果它有任何帮助,我正在使用ksh88.

避免输入这 30 个连续点的最佳方法是什么?

答案1

awk -F\; 'length($3) == 30' file.csv

如果您可能有空格(如图所示),您可以通过将其作为字段分隔符的一部分来消除它:

awk -F' *; *' 'length($3)==30' file.csv

答案2

GNU awk 并不总是匹配区间表达式,这就是{n}语法有要求。 POSIX 兼容的 awks 可能会接受-W re-interval启用该语法,因此请尝试这样做。但您可能正在运行系统 V 派生的 awk,它根本不接受间隔语法。

我认为最好的选择是将 FS 设置为正则表达式,这将允许您将分号周围的空格视为字段分隔符的一部分。这是一个更古老的 awk 功能,并且可能在您拥有的 awk 中得到支持。去掉空格后,您可以省去充满点的正则表达式,并使用 length() 函数来检查字段的长度。

awk -F"[ ]*;[ ]*" 'length($3) == 30 { print $3 }' file.csv

答案3

如果我理解正确的话,您想要打印第三个字段至少有 30 个字符长的行,不包括周围的空格。

awk -F ';' 'match($3, "[^ ].*[^ ]") && RLENGTH >= 30'

相关内容