我有下一个问题:
查看结构信息:
0 PATRAC_1 False Normal Normal 3 Not configure
我们有七列,七个值,所以,我需要使用 awk 获取这些值,在开始时我使用空格之类的分隔符,所以,如果我输入print $1
,我得到:“0”,如果我输入print $2
,我得到“PATRAC_1” , ETC。
但是当我尝试获取第 7 列时,我只得到:“Not”,因为“not”和“configure”之间有空格
那么,我能做些什么来解决它呢?
答案1
如果您的数据位于固定列,您可以要求 awk 在这些列上进行拆分列宽通过设置FIELDWIDTHS
。例如:
awk '
BEGIN{ FIELDWIDTHS="4 10 8 10 8 6 99" }
{ printf "1=%s 2=%s 7=%s\n", $1, $2, $7 }
'
给出
1=0 2=PATRAC_1 7=Not configure
答案2
默认情况下,awk 将任何空白序列视为列分隔符。它无法猜测您希望第七列跨越直到行尾(包括嵌入的空格),您需要告诉它。
由于列之间的空白数量不同,因此请保留基于空白的列定义。但不要使用最后一列,而是$7
使用该行的文本减去前六列。
awk '{
last_column = $0;
sub(/^[[:blank:]]*([^[:blank:]]+[[:blank:]]+){6}/, "", last_column);
print last_column;
}'
如果您有不支持字符类的旧版本 awk,请使用[ \t]
代替[[:blank:]]
。如果您的 awk 旧版本不支持正则表达式中的大括号,请创建该正则表达式的 6 个副本。