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,ExchangeTerminal=1,E1PhysPathTerm=PPS1 ;pmEs ;0
2015-12-21 09:30:00;ManagedElement=1,Equipment=1,Subrack=1,Slot=27,PlugInUnit=1,ExchangeTerminal=1,E1PhysPathTerm=PPS1 ;pmSes ;0
2015-12-21 19:30:00;ManagedElement=1,Equipment=1,Subrack=1,Slot=27,PlugInUnit=1,ExchangeTerminal=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
- 工作原理相同,但 for
sed
使用基本正则表达式通过查找四位数字,后跟破折号来查找“year-” - 所以你不必担心年份的变化
- 但如果您还不熟悉正则表达式,并且在需要使用它时也没有这些信息,那么输入的内容会稍微多一些并且更难记住