awk
您的代码有几个问题:
- 虽然
[:digit:]
指的是“任何数字”,但您仍然需要另一对方括号 ( [...]
) 来表示字符组:([[:digit:]]
只是您想要的图像“ a,any digit or _ ”,这将是[a[:digit:]_]
定义字符组的外部方括号。 )
;
您的模式( /.../
) 和相应的操作( ) 之间的分号 ( ){...}
将两者分开,因此您有一个没有操作的模式,导致标准操作 {print $0}
,以及没有模式的第二个操作,导致它对所有记录执行(即线)。
getline
要求在继续之前awk
阅读下一条记录(即行)。
将所有这些放在一起,您的代码将执行以下操作:
- 打印所有匹配的行
/^Tijd.*[:digit:][:digit:]Z$/
(即没有,因为[:digit:]
转换为“:,d,i,g, or t”之一)。
- 此外,对于所有行:阅读下一行并打印。
因此,它将打印除第一行之外的所有行(因为这是唯一一个不是任何其他行的下一行)。
假设您只想打印匹配“以'Tijd'开头并以两位数字后跟'Z'”的行,您可以使用以下代码:
awk '/^Tijd.*[[:digit:]][[:digit:]]Z$/{ print $0; }' rooster2.txt
由于{print $0}
是标准动作,您甚至可以将其缩短为
awk '/^Tijd.*[[:digit:]][[:digit:]]Z$/' rooster2.txt
要解决您的实际问题,您可以使用以下内容:
awk '/^Tijd.*[[:digit:]][[:digit:]]Z$/{year=substr($NF,1,4);month=substr($NF,5,2);day=substr($NF,7,2);hour=substr($NF,10,2);min=substr($NF,12,2);sec=substr($NF,14,2);$NF=day"."month"."year" "hour":"min":"sec}1' rooster2.txt
这工作如下:
- 对于匹配模式( ) 的记录(即行),根据您的需要重新排列最后一个字段( )。
/.../
$NF
- 打印所有记录(即行)(
1
是匹配所有记录(即行)的模式,没有指定操作,产生标准的()){print $0}
请注意,GNUawk
也有一个strftime
功能。但是,这需要时间戳采用不同的格式。如果你想使用它,你仍然必须重新排列field,首先:
awk -v FORMAT="%c" '/^Tijd.*[[:digit:]][[:digit:]]Z$/{$NF=strftime(FORMAT,mktime(substr($NF,1,4)" "substr($NF,5,2)" "substr($NF,7,2)" "substr($NF,10,2)" "substr($NF,12,2)" "substr($NF,14,2)))}1' rooster2.txt
现在,您只需要根据需要进行调整FORMAT
即可更改格式。详情请参阅man strftime
。