Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash打印任意大小数组的对角线_Bash_Awk - Fatal编程技术网

Bash打印任意大小数组的对角线

Bash打印任意大小数组的对角线,bash,awk,Bash,Awk,所以这里我有以下代码: #!/bin/bash awk 'BEGIN {f=4} {printf($f" "); f=f-1}' 这将需要输入,例如: 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 然后打印从右上角到左下角的对角线。 我的问题是。。如何对任何大小的数组执行此操作?我试过了 {f=NF} 但是,这导致:“awk:运行时错误:负字段索引$-1 FILENAME=“-”FNR=2 NR=2”问题在于,开始部分的NF不是第一行的令牌数。以下工作: awk '{i

所以这里我有以下代码:

#!/bin/bash
awk 'BEGIN {f=4} {printf($f" "); f=f-1}'
这将需要输入,例如:

1 2 3 4
5 6 7 8
9 1 2 3
4 5 6 7
然后打印从右上角到左下角的对角线。 我的问题是。。如何对任何大小的数组执行此操作?我试过了

 {f=NF}
但是,这导致:“awk:运行时错误:负字段索引$-1
FILENAME=“-”FNR=2 NR=2”

问题在于,
开始部分的
NF
不是第一行的令牌数。以下工作:

awk '{if (!f) f = NF; printf($f" "); f=f-1}'
编辑:根据评论中的建议,更干净、更安全的方法是:

awk '{if (!f) f = NF; printf("%s ", $f); f--}'
编辑:由于Ed已经利用了所有好的、适当的
awk
解决方案,我将提供一个本机
bash
解决方案:

$ cat t.sh
#!/bin/bash

while read -ra numbers; do
        : ${i:=${#numbers[@]}}
        diag+=("${numbers[--i]}")
done < test.txt
echo "${diag[@]}"
或者,如果要避免在输出行的末尾添加空格并使用终止换行符,请执行以下操作:

$ awk '{printf "%s%s", (NR>1?FS:""), $(NF+1-NR)} END{print ""}' file
4 7 1 4

f=f-1
可以更改为
f--
切勿将printf用于格式字符串所属的输入数据,否则当输入包含printf格式字符(如%)时,它将失败。使用
printf“%s”、$f
,而不是
printf$f
。将这些建议合并到评论中,谢谢。+1解释了问题的症结所在:在
BEGIN
块中——根据定义,它在任何输入文件之前执行——
NF
还没有(有意义的)值(也不是
NR
FNR
FILENAME
)。将在输出行末尾添加一个空格,并且不会在其末尾打印换行符。是的,就像原始的一样。这不是我想做的,但可能是OP出于某种原因想要的(可以用于命令替换,后面的换行符无论如何都会被吃掉,谁知道呢)。这一点很好。一如既往,一些预期的输出将是有用的,否则我们将试图通过读取一个不符合OP要求的脚本来确定输出应该是什么:-).这很聪明,就像往常一样。如果尾随空格和缺少换行符对OP没有影响,我就用你的第一个例子,将
ORS
设置为空格,这可能是最好的解决方案。对,我添加了两个备选方案。+1再次命中!
$ ./t.sh
4 7 1 4
$ awk '{print $(NF+1-NR)}' file    
4
7
1
4

$ awk -v ORS=" " '{print $(NF+1-NR)}' file
4 7 1 4 
$ awk '{printf "%s%s", (NR>1?FS:""), $(NF+1-NR)} END{print ""}' file
4 7 1 4