如何将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'
但我无法将其放入变量中,我需要在循环中使用它。我不会写 while read 行,因为它会打印每一行。
答案1
有很多方法可以做到这一点。像 Ainar-G 一样,我会使用 Awk:
$ cat abc.txt
col1 col2
1 35
1 20
1 40
1 50
下面忽略包含模式“col”的行;抓取文件中的第二列;然后对数字进行排序:
$ 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