linux - 如何将 .CSV 文件的标题与动态字段名称相匹配

标签 linux csv sed header cat

我希望我之前问题的简化版本听起来比之前好得多。我有一个 .CSV 文件(频率 - 每周),其标题包含其中两列中的年周值,该列每周都在变化。有关示例,请参见下文。

store nbr,city,state,region,item nbr,category,201420 sales,201420 sold qty
1001,Kansas City,MO,2,30945232,7,$11,1
1003,Kansas City,KS,3,30945742,6,$40,4
2004,New York,NY,6,30995232,11,$72,12
6003,Sacramento,CA,4,3025742,3,$24,6
9003,Cleveland,OH,9,3057432,12,$44,11
6009,Los Angeles,CA,4,3098294,42,$35,7

我必须检查数据是否放置在右列下,然后继续将该数据加载到数据集市中。因此,我尝试创建一个标准 header 来将其与该文件的 header 进行比较,如下所示:

store nbr,city,state,region,item nbr,category,XXXXXX sales,XXXXXX sold qty

如果我的文件(我即将加载)具有上述格式,我的进程应该继续加载数据。如果列不在其位置,则如下所示

store nbr,region,city,state,category,item nbr,201420 sold qty,201420 sales
1001,2,Kansas City,MO,7,30945232,1,$11
1003,3,Kansas City,KS,6,30945742,4,$40
2004,6,New York,NY,11,30995232,12,$72
6003,4,Sacramento,CA,3,3025742,6,$24
9003,9,Cleveland,OH,12,3057432,11,$44
6009,4,Los Angeles,CA,42,3098294,7,$35

那么该过程应该会失败。我主要担心的是 - 由于字段 7 和 8 的动态特性,我无法每周创建/匹配数据与标准 header 。字段名称中没有日期,我无法使用 sysdate(因为我可能必须使用第 7 个和第 8 个字段中日期非常旧的旧文件)。您能否建议我如何使用 cat/awk/sed 或使用 header 中的“年周”值的任何通配符来实现此目的?

最佳答案

如果“字段 14 和 15 的动态性质”意味着周值不断增加 1,那么您应该使用一些正则表达式来查找它。

我不确定这是否有效,因为我不知道 Column1-13 的实际值,但如果您使用 \d{6} 它将匹配 6 位数字的字符串(即 YYYYWW)。只要其他不共享此表单,您就可以随时使用该正则表达式获取年周值,然后用它执行您想要的操作。

或者,如果您不想使用正则表达式,您可以使用类似 cut -d, -f14 file.csv | cut -d""-f1 以打印出第 14 列的年-周值,然后将 -f14 更改为 -f15 以获得第 15 列的年-周值。

进入聊天室后我终于明白了OP的确切问题

通过使用 egrep 并将年周值替换为 [0-9]+ 并使用退出代码 ($?),我们能够检查 header 的格式是否正确。

关于linux - 如何将 .CSV 文件的标题与动态字段名称相匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25018703/

相关文章:

javascript - 使用谷歌脚本自动将 CSV 输出到谷歌表格

python - 从 csv 文件中删除具有特定值的所有行

c# - 使用c#将csv文件插入MYSQL表

macos - 如何在 mac 上用 tab 替换多个空格

bash 函数从 sed 传递空格和行分隔的参数

linux - 归档重新生成 shell 脚本

linux - Yocto:为什么在构建外部内核模块期间未定义结构模块

sql - Plesk 不显示所有数据库?

linux - 如何在 GNU/Linux 上设置 Subversion (SVN) 服务器 - Ubuntu

linux - InitScript Debian Insserv 未在启动时启动