AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 690427
Accepted
stormctr2
stormctr2
Asked: 2022-02-13 16:01:05 +0800 CST2022-02-13 16:01:05 +0800 CST 2022-02-13 16:01:05 +0800 CST

平均文件的一列

  • 772

我有一个 CSV 文件(带有时间戳数据),我有一个脚本,可以将一年中的每个月分成一个单独的文件。该脚本将花费该月并将数据平均为单个值。部分代码如下;所有其他月份将与一月份的第一个月份相同。该代码将根据第 9 列(月份编号为 1-12)将长达一年的文件分成月份,并将打印所有 17 个字段。下一个代码行是查看第 13 列并平均文件中的所有数据(忽略所有丢失的数据,指定为 -999)并将列平均值打印到新的 $i.monthlyavg 文件。

awk -F ',' '$9= 1 {print $0}' $i > Jan.tmp
awk 'NR > 1 { for i = 13) if ($i != -999) {sum[i] += $i; num[i]++}
END { for (i = 13) print i, sum[i], num[i], sum[i]/num[i] }' Jan.tmp > $i.monthlyavg

我收到以下错误消息.....

awk: cmd. line:1: NR > 1 { for i = 13) if (01-073-1003-SO2-1998.dat.out != -999) {sum[i] += 01-073-1003-SO2-1998.dat.out; num[i]++}
awk: cmd. line:1:              ^ syntax error
awk: cmd. line:1: NR > 1 { for i = 13) if (01-073-1003-SO2-1998.dat.out != -999) {sum[i] += 01-073-1003-SO2-1998.dat.out; num[i]++}
awk: cmd. line:1:                    ^ syntax error
awk: cmd. line:1: NR > 1 { for i = 13) if (01-073-1003-SO2-1998.dat.out != -999) {sum[i] += 01-073-1003-SO2-1998.dat.out; num[i]++}
awk: cmd. line:1:                                                  ^ syntax error
awk: cmd. line:1: NR > 1 { for i = 13) if (01-073-1003-SO2-1998.dat.out != -999) {sum[i] += 01-073-1003-SO2-1998.dat.out; num[i]++}
awk: cmd. line:1:                                                              ^ syntax error
awk: cmd. line:1: NR > 1 { for i = 13) if (01-073-1003-SO2-1998.dat.out != -999) {sum[i] += 01-073-1003-SO2-1998.dat.out; num[i]++}
awk: cmd. line:1:                                                                                                   ^ syntax error

和

 END { for (i = 13) print i, sum[i], num[i], sum[i]/num[i] }
awk: cmd. line:2:       ^ syntax error
awk: cmd. line:2:       END { for (i = 13) print i, sum[i], num[i], sum[i]/num[i] }
awk: cmd. line:2:                        ^ syntax error
awk: cmd. line:2:       END { for (i = 13) print i, sum[i], num[i], sum[i]/num[i] }
awk: cmd. line:2:                                                                  ^ unexpected newline or end of string

问题是什么?

awk syntax
  • 2 2 个回答
  • 52 Views

2 个回答

  • Voted
  1. G-Man Says 'Reinstate Monica'
    2022-02-14T00:38:00+08:002022-02-14T00:38:00+08:00

    for (i = 13)根本不是一个有效的 awk 构造。(我真的需要告诉你,这for i = 13) 甚至在语法上都不是有效的吗?)该for语句有两个版本:

    • for (expr1; expr2; expr3) statement
    • for (var in array) statement

    看起来您正在尝试使用第一个 ( )。如果您想查看所有 17 个字段,您可以使用, 或者更好的是. 如果您只想处理字段 #13 但保留循环结构,您可以使用. 但是,如果你想要简单、直接的代码来完成这项特定的工作,你可以使用for (expr1; expr2; expr3) statementfor (i = 1; i <= 17; i++)for (i = 1; i <= NF; i++)for (i = 13; i <= 13; i++)

    • i = 13; if ($i != -999) {sum[i] += $i; num[i]++},
    • if ($13 != -999) {sum[13] += $13; num[13]++}, 或者
    • if ($13 != -999) {sum += $13; num++}

    ...因为如果您只处理一列,则不需要数组。

    而且,正如“他们”所评论的那样,它看起来非常像您在双引号中运行 awk 的程序。如果你使用单引号,事情会好得多。

    • 0
  2. Best Answer
    they
    2022-02-14T00:41:01+08:002022-02-14T00:41:01+08:00

    如果您想为第 9 列中的每个单独值平均第 13 列中的数字,则无需为第 9 列中的每个值创建单独的文件。只需跟踪单独的总和并在最后输出它们。

    awk -F, '
        $13 != -999 { s[$9] += $13; n[$9]++ }
        END { for (i in s) print i, s[i]/n[i] }' some-file
    

    您的代码的主要问题是您编写for循环的方式存在语法错误。for根本不需要循环,因为我们只访问第 13 列。


    循环有for两种风格awk。你有“算术for循环”,这是你可能想要使用的。它通常使用来自某些初始化的计数器进行迭代,直到某些逻辑测试不再为true,并进行一些更新:

    for (initialization; logical-test; update) statement
    

    例如

    for (i = 1; i <= NF; ++i) print i
    

    另一种类型是我在上面的答案中显示的,它用于迭代数组的索引。请注意,循环可能不会以任何特定顺序遍历索引。

    for (index-variable in array) statement
    

    例如

    for (key in data) print key, data[key]
    
    • 0

相关问题

  • 根据第一个逗号之前的匹配删除重复行数

  • 在另一个文件之后逐行追加行

  • 如何删除两行之间的单行

  • 重新排列字母并比较两个单词

  • 多行文件洗牌

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve