如何将csv文件中的行转换为列?

如何将csv文件中的行转换为列?
2015-12-2119:30:00;ManagedElement=1,Equipment=1,Subrack=1

;pmEs
;0

我需要这个结果

2015-12-2119:30:00;ManagedElement=1,Equipment=1,Subrack=1;pmEs;0

来自评论的额外数据:

2015-12-21 19:30:00;ManagedElement=1,Equipment=1,Subrack=1,Slot=27,PlugInUnit=1,ExchangeTer‌​minal=1,E1PhysPathTerm=PPS1 ;pmEs ;0
2015-12-21 09:30:00;ManagedElement=1,Equipment=1,Subrack=1,Slot=27,PlugInUnit=1,ExchangeTer‌​minal=1,E1PhysPathTerm=PPS1 ;pmSes ;0
2015-12-21 19:30:00;ManagedElement=1,Equipment=1,Subrack=1,Slot=27,PlugInUnit=1,ExchangeTer‌​minal=1,E1PhysPathTerm=PPS1 ;pmUas ;900

答案1

鉴于您的示例看起来可能是某种日志的许多记录之一,每个日志记录都以2015-... 开头,您可以尝试以下快速方法:

tr -d '\n' < input.csv | sed 's/2015-/\n2015-/g' > output.csv

解释

  • 其中input.csv包含看起来像您的示例的行,其中您想要的内容始终以2015-...开头
  • tr -d '\n'删除新行。所以我们暂时删除所有新行
  • < input.csv将 的内容提供input.csv给标准输入,以便tr程序读取它
  • 然后,我们使用sed搜索2015-并替换前面的新行2015-来获取我们想要的行。否则,您的输入似乎来自日志,并且日志中通常有多个条目/记录,只会tr -d '\n'将所有不同的时间戳条目合并在一起形成一个巨大的连续行,并且不允许您辨别单个时间戳条目。因此,我们使用它sed来确保最终输出每行有一个记录,通过搜索可识别的记录分隔符,例如2015-并在其前面添加一个新行
  • > output.csv将结果保存到output.csv
  • 当然,如果记录不是从2015-例如我们已接近年底开始的,那么这当然行不通,很快就会结束,2016-所以您需要在明年到 2016 年进行修改。

更高级的版本

或者:

tr -d '\n' < input.csv | sed 's/\([[:digit:]]\{4\}\)-/\n\1-/g' > output.csv
  • 工作原理相同,但 forsed使用基本正则表达式通过查找四位数字,后跟破折号来查找“year-”
  • 所以你不必担心年份的变化
  • 但如果您还不熟悉正则表达式,并且在需要使用它时也没有这些信息,那么输入的内容会稍微多一些并且更难记住

相关内容