所以这里我有以下代码:
#!/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"
答案 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--}'