在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'