txtファイルの列の最大値と最小値を変数として印刷するには?
abc.txt
:
col1 col2
1 35
1 20
1 40
1 50
最大値と最小値を識別するコードを作成しました。
cut -f2 -d "" abc.txt|head -1
cut -f2 -d "" abc.txt|tail -1
v1 = 'echo <??>|cut -f2 -d "" abc.txt|head -1'
v2 = 'echo <??>|cut -f2 -d "" abc.txt|tail -1'
ただし、変数に入れることはできず、ループで使用する必要があります。私はすべての行を印刷しているので、読みながら行を書きません。
答え1
これを行う方法はいくつかあります。 Ainar-GのようにAwkを使いましょう。
$ cat abc.txt
col1 col2
1 35
1 20
1 40
1 50
以下は、「col」パターンを含む行を無視し、ファイルの2番目の列を取得して番号をソートします。
$ min=$(awk '!/col/ {print $2}' abc.txt | sort -nr | tail -1)
$ max=$(awk '!/col/ {print $2}' abc.txt | sort -nr | head -1)
$ echo "$min"
20
$ echo "$max"
50
答え2
awkプログラム:
FNR == 1 { next; }
FNR == 2 { max = min = $2; next }
{
if ($2 > max) {
max = $2;
} else if ($2 < min) {
min = $2;
}
}
END { printf("max: %d, min: %d\n", max, min); }
使用法:
$ awk -f ./tmp.awk ./tmp.txt
max: 50, min: 20
答え3
デスクトップ電卓を使用して数学演算を実行することもできます。直流Linuxのユーティリティ。スタックのデータに対して機能します。 ?コマンドを使用して行を読み取ると、オペランド(スペースで区切られた)がスタックに配置されます。これには、レジスタに格納された命令を再帰的に呼び出すことが含まれます。詳細については、gnu dcのマニュアルを参照してください。
$ if="abc.txt"
$ declare -a a=($(< "$if" tr x- x_ | sed 1d | dc -e "
[q]sq [sMd]sa [sNd]sb
[?z0=qddlM<adlN>bcz0=?]s?
?c ?dsMsN cl?x lMlNf"))
$ min=${a[0]} max=${a[1]}
$ echo "min:$min nax:$max"
min:20 max:50