【问题标题】:invoking an awk script in different ways以不同方式调用 awk 脚本
【发布时间】:2022-01-22 18:57:29
【问题描述】:

我编写了一个名为c_awk.awkawk 脚本,并希望像awk -f c_awk.awk file.csv 一样调用。

脚本如下所示:

awk 'BEGIN{FS=OFS=","}
     NR==FNR && 
     $7{sum+=$7; 
     elementos++; 
     next}
     !$7{$7=media}
     {print}
     ENDFILE{media=sum/elementos}' train.csv train.csv 

该文件在终端中进行复制粘贴时有效。 通过执行:gawk -f c_awk.awk,出现错误:

gawk: c_awk.awk:4: awk 'BEGIN{FS=OFS=","}
gawk: c_awk.awk:4:     ^ carácter «'» inválido en la expresión
gawk: c_awk.awk:4: awk 'BEGIN{FS=OFS=","}
gawk: c_awk.awk:4:     ^ syntax error

我不知道我做错了什么。 你能帮帮我吗?

调用的文件如下:(train.csv from Kaggle, Titanic)

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S
2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C
3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S
4,1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35,1,0,113803,53.1,C123,S
5,0,3,"Allen, Mr. William Henry",male,35,0,0,373450,8.05,,S
6,0,3,"Moran, Mr. James",male,,0,0,330877,8.4583,,Q
7,0,1,"McCarthy, Mr. Timothy J",male,54,0,0,17463,51.8625,E46,S

谢谢。

【问题讨论】:

  • copy-paste in the terminal. By executing it: gawk -f c_awk.awk 你的终端正在运行一个 shell,而不是 gawk。您可以运行sh c_awk.awk,也可以仅将文件替换为 awk 脚本。
  • IOW,如果你执行gawk -f ...,你应该删除文件中的awk和外面的单引号
  • @KamilCuk,我试过sh c_awk.awk,但它不起作用。无论如何,我需要执行问题中显示的脚本(由于我的失败,我进行了编辑,对不起):gawk -f c_awk.awk fil.csv
  • @WilliamPursell,你的意思是“外部单引号”在哪里?
  • 您的脚本当前看起来像awk '{program to awk}'。通过“外部单引号”,我的意思是如果您打算使用gawk 调用它,它应该只是{program to awk}。 (您还需要从脚本中删除输入文件并执行gawk -f program-file < input-file

标签: awk


【解决方案1】:

GNU AWK 关于Options 的手册指出

-f source-file
--file source-file

从源文件而不是在第一个非选项参数中读取 awk 程序源。这个选项可以多次给出;这 awk 程序由每个内容的串联组成 指定的源文件。(...)

所以选择的文件应该只包含 source 而不是整个命令。简单的例子,假设你想获得第一列,那么你可以创建 firstcol.awk 并包含以下内容

{print $1}

并按如下方式使用

awk -f firstcol.awk file1.txt file2.txt file3.txt

您可以选择为文件配备shebang并使其可执行,在这种情况下firstcol.awk内容是

#!/usr/bin/awk -f
{print $1}

而且用法是

./firstcol.awk file1.txt file2.txt file3.txt

如果您想查看其他示例,请咨询AWK in Wikibooks

【讨论】:

  • 我尝试了你所说的 shebang 和执行,但仍然不起作用。 awk -f c_awk.awk train.csv
【解决方案2】:

解决方案包括以下更改:

BEGIN{FS=OFS=","}
     NR==FNR && 
     $7{sum+=$7; 
     elementos++; 
     next}
     !$7{$7=media}
     {print}
     ENDFILE{media=sum/elementos}

【讨论】:

  • 对,这就是@Daweo 在their answer 的前半部分告诉你的,所以你应该accept their answer,而不是发布你自己的答案说同样的话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 2015-06-17
  • 2015-11-08
  • 2012-05-30
  • 1970-01-01
相关资源
最近更新 更多