2

現在のディレクトリには、次のような「gradesXXX」(XXX はコース番号) という形式の名前のファイルがあります。

ID           GRADE         (this line is not contained in the files)
123456789    56
213495873    84
098342362    77
.            .
.            .
.            .

上記のスクリプトの最初のパラメーターとして指定された、特定の数値を超えるグレードを持つすべての ID を出力する BASH スクリプトを作成したいと考えています。

要件は、ID を最大 1 回印刷する必要があり、中間ファイルを使用しないことです。最初のスクリプトは 1 行の長さで、2 つ目のスクリプトは最大 6 行の長さです (「#!」行を除く)。

私はこれでかなり迷っているので、どんな提案もいただければ幸いです。乾杯。

4

5 に答える 5

1

私が探していた答えは

// internal script
#!/bin/bash
while read line; do
    line_split=( $line )
    if (( ${line_split[1]} > $1 )); then
        echo ${line_split[0]}
    fi
done

// external script
#!/bin/bash
cat grades* | sort -r -n -k 1 | internalScript $1 | cut -f1 -d" " | uniq
于 2012-10-12T11:52:31.017 に答える
0

さらに別の解決策:

cat grades[0-9][0-9][0-9] | awk -v MAX=70 '{ if ($2 > MAX) foo[$1]=1 }END{for (id in foo) print id }'

| sort -nID を並べ替えたい場合は、その後に追加します。

于 2012-10-12T18:29:56.473 に答える
0

純粋な場合bash:

N=60
for file in /path/*; do
    while read id grade; do ((grade > N)) && echo "$id"; done < "$file"
done

出力

213495873
098342362
于 2012-10-12T18:38:00.573 に答える
0

OK、簡単な解決策です。

cat grades[0-9][0-9][0-9] | sort -nurk 2 | while read ID GRADE ; do if [ $GRADE -lt 60 ] ; then break ; fi ; echo $ID ; done | sort -u

2 つのスクリプトが必要な理由がわかりません。すべてスクリプトで:

#!/bin/bash

threshold=$1
cat grades[0-9][0-9][0-9] | sort -nurk 2 | while read ID GRADE ; do if [ $GRADE -lt $threshold ] ; then break ; fi ; echo $ID ; done | sort -u

最初にすべてのグレード ファイルを分類し、グレードごとに逆順に並べ替えます。成績がしきい値を下回ると while ループが中断されるため、成績が高い行だけに ID が出力されます。sort -uすべての ID が 1 回だけ送信されるようにします。

于 2012-10-11T08:37:15.007 に答える
0

使用できますawk

awk '{ if ($2 > 70) print $1 }' grades777

秒列が 70 より大きいすべての行の最初の列を出力します。しきい値を変更する必要がある場合:

N=71
awk '{ if ($2 > '$N') print $1 }' grades777

AWK でシェル変数'を渡すために必要です。現在のディレクトリ内のすべてのファイルを操作し、重複した行を削除するには:grade???

awk '{ if ($2 > '$N') print $1 }' grades??? | sort -u

シンプルな 1 行のソリューション。

于 2012-10-12T17:54:32.363 に答える