ksh:将awk命令的输出存储在数组中


1

我有以下awk命令:

awk -F ' ' '{ print $NF }' log filename

它给出的输出如下:

06:00:00
parameters:
SDS
(2)
no
no
no
no

doc=4000000000).


information:
0
5898
5898
06:06:25

问题是我需要将其保存在数组中。例如当我打印或回显$array[0]

我应该得到 06:00:00

同样

$array[1] = parameters:
.
.
.
$array[n] = 06:06:25

我的最终目标是使用打印语句打印它们,即

printf("start time: %d  and end time: %d", array[0], array[n]")

输出量

start time:06:00:00 and end time:06:06:25

1
awk有数组,为什么需要使用ksh数组?
斯特凡Chazelas

给定的printf语句将打印“开始时间:6,结束时间:6”,因为%d强制转换为整数。
Henk Langeveld

Answers:


2

应该这样做:

array=( $(awk -F ' ' '{ print $NF }' log filename) )

鉴于@Stephane的评论,另一种方法是:

array=()
awk -F ' ' '{ print $NF }' log filename | while IFS= read -r line; do
    array+=( "$line" )
done
echo ${#array[@]}
echo ${array[1]}
echo ${array[17]}
17
06:00:00
06:06:25

在我的ksh“ 93u +”上工作


1
跳过空行,如果输出包含制表符或通配符,您将遇到问题。
斯特凡Chazelas

使用bash,pdksh或其他一些shell array也会遇到问题,这些shell 将在管道运算符的RHS上定义/修改的变量放到子shell中,在循环后将为空。
dannysauer

是的,但是幸运的是标签是ksh。
格伦·杰克曼(Glenn Jackman),2013年

许多Linux系统和其他一些系统将pdksh用作其“ ksh”。我将awk命令作为ksh协进程放在后台,然后亲自read使用-p参数从该协进程中读取。两者都适用。
dannysauer

@glennjackman:我曾经尝试说过这个错误,但我尝试过第一次批准。 ksh: 0403-057 Syntax error: (“不expected.`通过特林你的第二个方法我得到了同样的错误 ksh: 0403-057 Syntax error: (”未expected.`
拉姆

0

看起来您只需要第一条记录和最后一条记录的最后一个字段的值。

最好awk自己完成:

nawk 'NR == 1 {start=$NF}
    {last=$NF}
    END { 
         printf("start time: %s  and end time: %s", start, last)
    }' log filename
start time: 06:00:00  and end time: 06:06:25

如果要随机访问字段,请使用以NR(记录号/行号)为索引的数组awk

nawk '{
    last[NR]=$(NF)
} END {
    print last[1],last[NR-1]
}' log
06:00:00 5898

@HenkLangevelt:如果我想获得其他值,例如0和5898(最后一个值),那是因为我要使这成为一个泛型并且仅更改变量以根据要求打印不同变量。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.