【问题标题】:Script to map columns in two csv files用于映射两个 csv 文件中的列的脚本
【发布时间】:2018-11-23 11:45:56
【问题描述】:

我正在尝试在两个 .csv 文件中映射列值。它是一个高维数据文件,但我只关心在第二个 .csv 文件中映射和添加新字段。

我的 File1 .csv 文件有标签:#Sender ID、#Type; 我的 File2 .csv 文件有标签:#Sender ID、#Label;

我要做的是如果#sender ID(File1) = sender ID(File2),然后在文件 2 中添加一个新列,定义类型。由于发件人 ID 是随机且重复的,因此无法简单地复制粘贴文件 2 中的#type->#Label 列。

我查看了“awk”命令行,但不确定如何继续使用它,以及这是否有助于解决问题。请建议。

File1.csv(输入) #Sender ID,#Recieve ID, #Noise, #Position, #Type, #velocity 23,value,value,value, 1, value 43,value,value,value, 2, value 12,value,value,value, 1, value 78,value,value,value, 0, value 43,value,value,value, 2, value

File2.csv(输入) #Sender ID,#Acc,#Angle,#Label 23,value, value, NaN 43,value,value, NaN 12,value,value, NaN 78, value,value,NaN 43, value,value, NaN

File2.csv(预期输出) #Sender ID,#Acc,#Angle,#Label 23,value, value, 1 43,value, value, 2 12,value, value, 1 78,value, value, 0 43,value, value, 2

原始文件 1 标题: sender, attackerType, messageID

原始文件 2 标题: type, rcvTime, sendTime, sender, messageID, pos__001, pos__002, pos__003, pos_noise__001, pos_noise__002, pos_noise__003, noise__001, noise__002, noise__003, spd__001, spd__002, spd__003, spd_noise__001, spd_noise__002, spd_noise__003, RSSI, Label

预期的文件 2 标头应将 #sender 与文件 1 匹配,然后使用相应的 #attackerType 更新 #Label 字段(标签属性最初为空)。

这是我所做的:`awk 'BEGIN {FS=OFS=","}

NR==FNR {a[$1]=$2;下一个} {$4=a[$22]}1' File1.csv File2.csv`

请记住,两个文件的行数不同。

【问题讨论】:

  • awk 似乎是完成这项任务的最佳工具。但是,您的问题描述缺少示例输入/输出
  • 感谢您回复@karakfa。我已添加示例输入和预期输出文件。希望对您有所帮助。
  • 请将文件内容贴在正文中,并用{}进行格式化
  • 刚刚做到了。如果这没有帮助,请告诉我。谢谢。
  • 求助的艺术来了。您的示例输入/输出应涵盖您警告的边缘情况。在这里只需设置 output=file1 就可以了。另外,不清楚标题是否是文件的一部分。

标签: csv awk mapping


【解决方案1】:

awk 来救援!

$ awk 'BEGIN   {FS=OFS=","} 
       NR==FNR {a[$1]=$5; next} 
       FNR>1   {$4=a[$1]}1' file1 file2

如果您的分隔符周围有不均匀的空间,则可能需要使用分隔符。

如果 file2 中有多余的键,则值 NAN 将被删除。为防止这种情况发生,您可能需要将 && ($1 in a) 添加到 FNR>1 条件。

【讨论】:

  • 感谢您的回复。我尝试运行代码,但我在终端中按原样打印了 file2。没有来自 File1 的添加/映射。
  • 这很奇怪! $4=a[$1] 应该覆盖第四个字段。测试删除FNR>1 条件(标题会出错)。
  • 不走运。让我为文件添加原始标题 {}。也许这会有所帮助。
  • 为什么放$22,File2中哪一列是key?
  • #Label 栏目有 22 美元。密钥是 $4 是文件 2 中的发件人。
猜你喜欢
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多