【问题标题】:CSV manipulation with shell script使用 shell 脚本进行 CSV 操作
【发布时间】:2017-07-15 10:23:32
【问题描述】:

我有一个这样的 CSV 文件

Country,Jan1,Feb1,.....,Dec16 
India,100,2000,........,1500
China,4768,46783,.......,3000
Canada,4789,7393,.......,9843

我想得到以下格式的输出

India,100,Jan1 
China,4768,Jan1
Canada,4789,Jan1
India,2000,Feb1
China,46783,Feb1
Canada,7393,Feb1
.
.
.
India,1500,Dec16
China,3000,Dec16
Canada,9843,Dec16

谁能分享一下,上面的事情在Shell脚本中是如何实现的?

感谢和问候, 罗宾大卫

【问题讨论】:

  • 必须是shell脚本吗? Python 脚本会更容易编写,并且几乎在 linux 上得到广泛支持?
  • 你试过awk-F,吗?
  • StackOverflow 旨在帮助人们修复现有代码,任何代码。只需向我们展示您对解决问题的最佳理解。如果您需要教程,请从 grymoire.com/unix/Awk.html 开始。然后使用该信息,发布一些代码,人们会提供帮助。请阅读 stackoverflow.com/help/how-to-askstackoverflow.com/help/dont-askstackoverflow.com/help/mcve 并在此处发布更多问题之前使用 tour。祝你好运。
  • 与其要求人类解析示例输出并弄清楚您想要什么,不如尝试仔细描述输出。然后将该描述转换为计算机可以理解的语言。然后你就完成了。

标签: linux shell csv unix data-manipulation


【解决方案1】:

你可以试试这个 awk 脚本:

script.awk

BEGIN { ctrNo = 1 }

NR==1 { # store time colheaders
        for( c = 2 ; c <= NF; c++ ) TimeMember[ c-1] = $c;
        next
      }

      { # for NR > 1: store value under key country and TimeMember
        ctry = $1
        for( c = 2; c<= NF; c++ ) {
          key = sprintf("%s,%s", ctry, TimeMember[ c - 1 ] )
          values[ key ] = $c
        }

        if( !( ctry in seen) ) { 
          seen[ ctry ] = 1;
          countries [ ctrNo++ ] = ctry
        }
      }

END   {
        OFS=FS
        for( c = 1; c <= length( TimeMember ) ; c++ ){
          for( ctr = 1; ctr <= length( countries ) ; ctr++ ) {
            key = sprintf("%s,%s", countries[ ctr], TimeMember[ c ] )
            print countries[ ctr], values[ key ], TimeMember[ c ]
          }
        }
      }

你运行它:awk -F, -f script.awk yourfile

说明

  • BEGIN 部分初始化一个变量
  • NR==1 Action 在第一行执行,它存储了第一行的所有 TimeMembers。 next 负责跳过其他操作。
  • 以下操作解析数据行并将每个 TimeColumn 中的值与 CountryMember 存储在 values 中。在END Action 的输出过程中,每个新国家/地区都会获得一个新的序列号
  • END 操作处理打印存储的信息。它循环遍历第一行中的不同 TimeMembers 和数据行第一列中 Country Dimension 中的每个成员。

【讨论】:

    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2012-10-27
    • 2015-08-12
    • 2019-08-26
    • 2020-02-27
    • 1970-01-01
    相关资源
    最近更新 更多