3

sort メソッドの結果を、各セルに単語が含まれる配列に入れたいと思います。私はこのコードを試しましたが、 $file の一部のみが印刷され、ソートされていません:

#!/bin/bash
for file in `ls ${1}` ; do
    if [[ ! ($file = *.user) ]] ; then
        continue
    fi

    arr=(`sort -nrk4 $file`)
    echo ${arr[*]}

done

なぜこれが機能しないのですか?これどうやってするの?

データファイル:

name1 01/01/1994 a 0
name2 01/01/1994 b 5
name3 01/01/1994 c 2

ソート行のみ (sort -nrk4 $file) を実行すると、次のように出力されます。

name2 01/01/1994 b 5
name3 01/01/1994 c 2
name1 01/01/1994 a 0

上記の 2 行を実行すると、次のように出力されます。

 name1 01/01/1994 a 0
4

1 に答える 1

1

出力の各行をsort独自の配列要素に入れるにはIFS、改行を設定する必要があります。配列を出力するには、配列を反復処理する必要があります。

#!/bin/bash
for file in $1; do
    if [[ ! $file = *.user ]]; then
        continue
    fi

    saveIFS=$IFS
    IFS=$'\n'
    arr=($(sort -nrk4 "$file"))
    IFS=$saveIFS
    for i in "${arr[@]}"
    do
        echo "$i"
    done

done

または、リセットIFSしないでください。出力にループを使用しないでください。次のコマンドは、改行で区切られた要素を出力します。これは、引用符で囲まれたコンテキストで添え字に が使用されているIFS場合、 の最初の文字が出力セパレーターに使用されるためです。*

echo "${arr[*]}"

引用するとすべてが解決することを忘れないでください。

ループで使用lsしないでください。forグロビング$1が含まれている可能性がある場合は、引用符を付けないでください。そうでない場合は、ディレクトリまたはファイル名に空白文字が含まれている可能性がある場合に備えて、引用符で囲む必要があります。理想的には、$1ここで使用する前に の内容を検証する必要があります。

比較演算子は否定演算子よりも優先順位が高いため、括弧は不要です。

コマンド置換で$()は、バッククォートよりも優先されます。ネストされているため、より読みやすく、使いやすくなっています。

そして最後に、変数を展開するときは、を引用符で囲む必要があります。また、@ほとんどの場合、添字配列に使用する必要があります。

于 2012-05-19T11:15:15.457 に答える