【问题标题】:shell script to match column and add new columns into table from file用于匹配列并将新列从文件添加到表中的 shell 脚本
【发布时间】:2019-03-03 19:00:19
【问题描述】:

我正在尝试编写一个 shell 脚本来比较两个单独的文件,并在地址和 LocationID 匹配时将 x/y/objectID/Status/Data 信息添加到第一个文件中。这是我的文件的样子:

文件A.csv:

MAC     LocationID     Node_ID     Street     City     State     Zip_Code
ABC123  182            AB12        25_Main_St Hanover  WZ        12345
CDE123  128            CD12        35_Main_St Hooray   TZ        23456
EFG123  812            EF12        45_Main_St Hello    WA        45678

文件B.csv

objectid  Status  Data   X        Y       LocationID     Node_ID     Street     City     State     Zip_Code
555       RRR     sss    123456   123444  182            AB12        25_Main_St Hanover  WZ        12345
666       GGG     ttt    234567    87978  128            CD12        35_Main_St Hooray   TZ        23456
777       RRR     uuu    54321     98765  812            EF12        45_Main_St Hello    WA        45678

我很难找到任何类似于 linux shell 脚本示例的内容。有没有人有建议的方式来加入这两个文件?结果如下:

MAC       objectid  Status  Data   X        Y       LocationID     Node_ID     Street     City     State     Zip_Code
ABC123    555       RRR     sss    123456   123444  182            AB12        25_Main_St Hanover  WZ        12345
CDE123    666       GGG     ttt    234567   87978   128            CD12        35_Main_St Hooray   TZ        23456
EFG123    777       RRR     uuu    54321    98765   812            EF12        45_Main_St Hello    WA        45678

请注意,文件的顺序不一定相同,Mac 文件中的行数比非 Mac 文件中的多。 Mac 文件有重复的 LocationID 和地址,但 Mac 的都是不同的。非 mac 文件不会有重复的 LocationID 或地址。

【问题讨论】:

  • 使用awk。将FileB 读入一个使用locationID 作为键的数组中。然后读取FileA并将数组中的字段合并到当前行并打印出来。

标签: linux shell file join awk


【解决方案1】:

您可以使用awk:

awk 'FNR == NR{k[$2]=$1; next} $6 in k{print k[$6], $0}' fileA fileB | column -t

MAC     objectid  Status  Data  X       Y       LocationID  Node_ID  Street      City     State  Zip_Code
ABC123  555       RRR     sss   123456  123444  182         AB12     25_Main_St  Hanover  WZ     12345
CDE123  666       GGG     ttt   234567  87978   128         CD12     35_Main_St  Hooray   TZ     23456
EFG123  777       RRR     uuu   54321   98765   812         EF12     45_Main_St  Hello    WA     45678
  • column -t 已用于以表格形式格式化输出。
  • 在第一遍中,我们处理fileA 并将第一列与键作为第二列存储在关联数组k
  • 在第二遍中,我们处理fileB 并使用键作为第 6 列(即 LocationID)来获取 MAC 地址。

【讨论】:

  • 如果文件中的列信息之间有逗号而不是空格,您的解决方案会有什么变化吗?
  • 如果文件以逗号分隔,则使用:awk 'BEGIN{FS=OFS=","} FNR == NR{k[$2]=$1; next} $6 in k{print k[$6], $0}' fileA fileBcolumn 命令作为column -s ',' -t
猜你喜欢
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多