嗨,我需要制作一个awk脚本,以便解析CSV文件并在bash中对其进行排序. 我需要从维基百科上获得一份总统名单,并按年对他们的任职年限进行排序. 当所有内容都整理好后,每个EAR都需要放在一个文本文件中. 我不确定我做得对不对

以下是我的CSV文件的一部分:

28,Woodrow Wilson,http:..en.wikipedia.org.wiki.Woodrow_Wilson,4.03.1913,4.03.1921,Democratic ,WoodrowWilson.gif,thmb_WoodrowWilson.gif,New Jersey
29,Warren G. Harding,http:..en.wikipedia.org.wiki.Warren_G._Harding,4.03.1921,2.8.1923,Republican ,WarrenGHarding.gif,thmb_WarrenGHarding.gif,Ohio 

我想包括2美元,这是我认为的名字,并按4美元排序,这是总统就职的日期

以下是我的实际awk文件:

#!/usr/bin/awk -f
 -F, '{
if (substr($4,length($4)-3,2) == "17")
 { print $2 > Presidents1700 }
else if (substr($4,length($4)-3,2) == "18")
{ print $2 > Presidents1800 }
else if (substr($4,length($4)-3,2) == "19")
{ print $2 > Presidents1900 }
else if (substr($4,length($4)-3,2) == "20")
{ print $2 > Presidents2000 }
}' 

下面是我运行它的函数:

SplitFile() {                                                                              
printf "Task 4: Spliting file based on century\n"                                                                                                            
awk -f $AFILE ${custFolder}/${month}/$DFILE                                                                                                                  
}

其中$AFILE是我的awk文件,右侧列出的目录指向我的实际文件.

这是我的输出的一部分,它实际上有几百行长,但在 它的一部分看起来是这样的:

awk: presidentData/10/presidents.csv:47: 46,Joseph Biden,http:..en.wikipedia.org.wiki.Joe_Biden,20.01.2021,Incumbent ,  Democratic   , Joe_Biden.jpg,thmb_Joe_Biden.jpg,Pennsilvania                                                                                                                                                                    awk: presidentData/10/presidents.csv:47:                ^ syntax error                                                                                                      awk: presidentData/10/presidents.csv:47: 46,Joseph Biden,http:..en.wikipedia.org.wiki.Joe_Biden,20.01.2021,Incumbent ,  Democratic   , Joe_Biden.jpg,thmb_Joe_Biden.jpg,Pennsilvania                                                                                                                                                                    awk: presidentData/10/presidents.csv:47:                                                                  ^ syntax error                                                    
awk: presidentData/10/presidents.csv:47: 46,Joseph Biden,http:..en.wikipedia.org.wiki.Joe_Biden,20.01.2021,Incumbent ,  Democratic   , Joe_Biden.jpg,thmb_Joe_Biden.jpg,Pennsilvania                                                                                                                                                                    awk: presidentData/10/presidents.csv:47:                                                                                             ^ syntax error                         
awk: presidentData/10/presidents.csv:47: 46,Joseph Biden,http:..en.wikipedia.org.wiki.Joe_Biden,20.01.2021,Incumbent ,  Democratic   , Joe_Biden.jpg,thmb_Joe_Biden.jpg,Pennsilvania                                                                                                                                                                    awk: presidentData/10/presidents.csv:47:  

我知道输出不是很有帮助;我宁愿只是截图,但我做不到.我试图获得帮助,但这些在线课程可能真的很难,而且很难在远程获得帮助,上面的语法错误似乎指向CSV文件中的逗号.

推荐答案

编辑后,很明显,您正在try 按世纪对总统进行分类,输出总统任职的世纪.

正如我在上面的注释中所述,您不能在awk脚本文件中包含单引号或命令行参数.您可以使用BEGIN {...}规则来设置字段分隔符FS = ",".然后有几种方法可以在第四个领域中拆分东西.split()和其他任何事情一样容易.

这将给您留下总统任职的第四个arr元素的结束年份(arr[0]始终是与所使用的任何REGEX匹配的完整表达式).然后,只需先与最大的年份进行比较,然后从那里开始递减,将输出重定向到该世纪的输出文件.

继续您开始的内容,您的awk脚本将类似于:

#!/usr/bin/awk -f

BEGIN { FS = "," }

{ 
  split ($4, arr, ".")
  if (arr[3] >= 2000)
    print $2 > "Presidents2000"
  else if (arr[3] >= 1900)
    print $2 > "Presidents1900"
  else if (arr[3] >= 1800)
    print $2 > "Presidents1800"
  else if (arr[3] >= 1700)
    print $2 > "Presidents1700"
}

现在将其设置为可执行的(为方便起见).假定脚本在文件pres.awk中:

$ chmod +x pres.awk

现在只需调用awk脚本,将.csv文件名作为参数传递,例如

$ ./pres.awk my.csv

现在列出名为Presid*的文件,并查看创建的内容:

$ ls -al Presid*
-rw-r--r-- 1 david david 33 Oct  8 22:28 Presidents1900

并确认里面的内容是您需要的:

$ cat Presidents1900
Woodrow Wilson
Warren G. Harding

假设这就是您正在根据您的try 寻找的输出.

(note:输出文件名需要加引号以确保,例如Presidents1900不会被视为尚未设置的变量)

如果你还有其他问题,请告诉我.

Linux相关问答推荐

我想显示包含一个方括号的行,方括号可以是开括号,也可以是闭括号.

替换前 3 个字符范围内的所有整数

使用 AWK 过滤 Linux 输出

如何为命令的所有选项启用无密码 sudo?

问题:Virtio rpmsg 总线 virtio0:收到的 msg 没有收件人 - 在 Yocto Hardknott - imx7d-pico

进程Forking 后 pthread_key_create() 生成的密钥会发生什么?

我可以阅读 Linux 内核的哪些部分以获得乐趣?

如何在makefile中包含静态库

如何使用 GDB 和 QEMU 调试 Linux 内核?

每次来宾重新启动后 Vagrant 执行脚本或命令(vagrant up)

如何在 linux 上为 JNI 应用程序编译动态库?

如何使用该位置的相对路径在单个位置创建多个文件夹?

从 .war 文件外部化 Tomcat webapp 配置

如何仅使用 SED 获得第二行

用于 ssh 的类似 teamviewer 的工具?

Anaconda:禁用提示更改

如何在没有 root 用户的情况下在 Linux (CentOS) 中安装软件包并进行自动依赖处理?

Linux:删除多个文件的文件扩展名

linux脚本杀死java进程

Bash:等待超时