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