3

1行に特定の最大数の要素のみが表示されるように入力(改行で区切られる)をフォーマットする* nixコマンドはありますか?例えば:

$はいx| ヘッド-10| コマンド4
xxxx
xxxx
xx

このタスクを実行する簡単な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
4

5 に答える 5

8

配列はスライスできます。

$ foo=(q w e r t y u)
$ echo "${foo[@]:0:4}"
q w e r
于 2012-05-20T00:34:04.870 に答える
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
于 2012-05-20T02:06:48.730 に答える
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] }'
于 2012-05-20T00:49:00.730 に答える
0

なぜあなたは次のようなものを試してはいけないのですか

sed 's|\(.{10}\)|\1\n|'

私はウィンドウマシンで作業していますが、これは試していません。私の考えは、すべてをN回一致させ、一致したパターンと改行文字に置き換えることです。

PS構文上の障害がある場合は、sed式を修正してください。

于 2012-05-20T02:08:27.683 に答える
0

これにはxargs(1)を使用でき、-nor--max-args=オプションを使用してコマンドラインごとの引数の数を制限できます。

$ yes x | head -10 | xargs -n4
x x x x
x x x x
x x
$

明らかに、入力を信頼できる必要があります。たとえば、引用符が一致しない場合、xargsは有名に壊れます。

$ yes 'x"' | head -10 | xargs -n4
xargs: unmatched double quote; by default quotes are special to xargs unless you use the -0 option
$
于 2021-09-24T19:29:54.200 に答える