gpt4 book ai didi

linux - 文件 Linux Shell 中的列操作

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:57 25 4
gpt4 key购买 nike

我有一个文件,其中的条目由空格分隔。例如:

example.txt

24676 256 218503341 2173
13236272 500 1023073758 5089
2230304 96 15622969 705
0 22 0 526
13277 28 379182 141

我想在命令行中打印“第 1 列/第 3 列”或类似的结果。我相信这可以用awk来完成。然而,有些条目是 0,因此除以 0 得到:

fatal: division by zero attempted

在更高级的情况下,我想找到除法的中值(或某个百分位数)。

最佳答案

有很多方法可以忽略除数为零的行,包括:

awk '$3 != 0 { print $1/$3 }' your-data-file

awk '{ if ($3 != 0) print $1/$3 }' your-data-file

问题变了——改为打印 0。答案并不难:

awk '{ if ($3 != 0) print $1/$3; else print 0 }' your-data-file

中位数和其他百分位数的处理要复杂得多。如果数据已排序,则最简单。如此简单,以至于我希望使用数字排序,然后从那里处理数据。


我挖出一个旧的 shell 脚本来计算描述性统计数据 - 单个数字数据列的最小值、最大值、众数、中值和十分位数:

:   "@(#)$Id: dstats.sh,v 1.2 1997/06/02 21:45:00 johnl Exp $"
#
# Calculate Descriptive Statistics: min, max, median, mode, deciles

sort -n $* |
awk 'BEGIN { max = -999999999; min = 999999999; }
{ # Accumulate basic data
count[$1]++;
item[++n] = $1;
if ($1 > max) max = $1;
if ($1 < min) min = $1;
}
END { # Print Descriptive Statistics
printf("# Count = %d\n", n);
printf("# Min = %d\n", min);
decile = 1;
for (decile = 10; decile < 100; decile += 10)
{
idx = int((decile * n) / 100) + 1;
printf("# %d%% decile = %d\n", decile, item[idx]);
if (decile == 50)
median = item[idx];
}
printf("# Max = %d\n", max);

printf("# Median = %d\n", median);
for (i in count)
{
if (count[i] > count[mode])
mode = i;
}
printf("# Mode = %d\n", mode);
}'

minmax 的初始值并不完全科学。它可以说明一个观点。

(这个 1997 年的版本几乎与其 1991 年的前身相同 - 事实上,除了版本信息行之外,其他所有内容都是相同的。因此,代码已有 20 多年的历史了。)

关于linux - 文件 Linux Shell 中的列操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9763940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com