是否有* nix命令格式化输入(由换行符分隔),以便每行只显示特定的最大元素数?例如:
$ yes x | head -10 | command 4 x x x x x x x x x x
我编写了一个执行此任务的快速bash
脚本(如下所示),但它似乎很长并且可能效率低下。有更好的方法吗?
#!/bin/sh
if [ -z "$1" -o -z "$2" ]; then
echo Usage `basename $0` {rows} {columns}
exit 1
fi
ROWS=$1
COLS=$2
input=$(yes x | head -${ROWS})
lines=()
i=0
j=0
eol=0
for x in ${input[*]}
do
lines[$i]="${lines[$i]} $x"
j=`expr $j + 1`
eol=0
if [ $j -ge ${COLS} ]; then
echo lines[$i] = ${lines[$i]}
i=`expr $i + 1`
j=0
eol=1
fi
done
if [ ${eol} -eq 0 ]; then
echo lines[$i] = ${lines[$i]}
fi
答案 0 :(得分:8)
阵列可以切片。
$ foo=(q w e r t y u)
$ echo "${foo[@]:0:4}"
q w e r
答案 1 :(得分:4)
printf '%-10s%-10s%-10s%s\n' $(command | command)
printf
将一次消耗格式字符串中指定的参数数量并继续使用,直到它们全部消耗完为止。
演示:
$ printf '%-10s%-10s%-10s%s\n' $(yes x | head -n 10)
x x x x
x x x x
x x
$ printf '%-10s%-10s%-10s%s\n' $(<speech)
now is the time
for all good men
to come to the
aid of their country
答案 2 :(得分:1)
yes x | head -10 | awk 'BEGIN { RS = "%%%%%%%" } { split($0,a,"\n"); for (i=1; i<length(a); i+=4) print a[i], a[i+1], a[i+2], a[i+3] }'
更具可读性:
yes x | \
head -10 | \
awk 'BEGIN { RS = "%%%%%%%" }
{ split($0,a,"\n");
for (i=1; i<length(a); i+=4) print a[i], a[i+1], a[i+2], a[i+3] }'
答案 3 :(得分:0)
为什么不尝试像
这样的东西sed 's|\(.{10}\)|\1\n|'
我正在使用Window机器并且没有尝试过这个。我的想法是将所有内容匹配N次并用匹配的模式替换它们以及换行符。
P.S请更正任何合成故障的sed表达式。