用于映射两个csv文件中的列的脚本

时间:2018-06-13 19:33:10

标签: csv awk mapping

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

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

我想要做的是,如果#sender ID(File1)=发件人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 =一个[$ 21]} 1' File1.csv File2.csv`

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

1 个答案:

答案 0 :(得分:2)

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条件。

相关问题