我希望我之前问题的简化版本听起来比之前好得多。我有一个 .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/