任意大小阵列的Bash打印对角线

时间:2014-03-21 19:12:40

标签: 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"

3 个答案:

答案 0 :(得分:3)

awk '!i{i=NF}{printf "%s ",$i;i--}'

编辑:由于Ed已经利用了所有正确的awk解决方案,我将投入本地bash解决方案:

$ cat t.sh
#!/bin/bash

while read -ra numbers; do
        : ${i:=${#numbers[@]}}
        diag+=("${numbers[--i]}")
done < test.txt
echo "${diag[@]}"

$ ./t.sh
4 7 1 4

答案 1 :(得分:3)

$ 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

答案 2 :(得分:2)

问题是,NF部分的BEGIN不是第一行上的令牌数量。以下作品:

awk '{if (!f) f = NF; printf($f" "); f=f-1}'

修改:根据评论中的建议,更清洁,更安全的方式是:

awk '{if (!f) f = NF; printf("%s ", $f); f--}'