如何使用python或Shell脚本将文本(文本文件)分解为下一行?

时间:2017-05-22 09:46:12

标签: python bash shell

我有一个文本文件,文件包含日志,问题是所有日志都在单行中,我必须使用python或shell脚本在单独的行中打破日志。

我没有办法如何做到这一点。

示例文件内容:

2AUK20170407000006002840700014DeitzpiascECCSERVICE1                     SAPMSSY1                                3001ZRFC_ICICI&&ZRFC_ICICI                                          itzpiascs           2AUK20170407000006002840700014DeitzpiascECCSERVICE1                     SAPMSSY1                                3001SYSU&&SYSTEM_RESET_RFC_SERVER                                   itzpiascs           2AUK20170407000007002840700014DeitzpiascECCSERVICE1                     SAPMSSY1                                3001ZRFC_ICICI&&ZRFC_ICICI                                          itzpiascs           

4 个答案:

答案 0 :(得分:2)

如果我弄错了,你需要一个包含4列数据的文件。使用awk,解决方案将如下所示:

awk '{for (i=0; i<NF/4; i++) print $(i*4+1)" "$(i*4+2)" "$(i*4+3)" "$(i*4+4)}' file.txt

输出:

2AUK20170407000006002840700014DeitzpiascECCSERVICE1 SAPMSSY1 3001ZRFC_ICICI&&ZRFC_ICICI itzpiascs
2AUK20170407000006002840700014DeitzpiascECCSERVICE1 SAPMSSY1 3001SYSU&&SYSTEM_RESET_RFC_SERVER itzpiascs
2AUK20170407000007002840700014DeitzpiascECCSERVICE1 SAPMSSY1 3001ZRFC_ICICI&&ZRFC_ICICI itzpiascs

答案 1 :(得分:1)

您可以在python中使用re(正则表达式)库来完成此任务。这将用新的换行符替换文本中的任何空格。

import re
with open('yourfile.txt') as f:
    print(re.sub(r'\s+', '\n', f.read()))

如果您想进行更复杂的操作,可以使用re.split来获取字符串列表。

答案 2 :(得分:1)

  

新线应该从2AUK开始 - Nikhil.J

Python 解决方案(在Python 3.5上测试):

import re
with open('log.txt', 'r') as f:
    contents = re.sub(r'(?<!^)2AUK', '\n2AUK', re.sub(r'\s{2,}', ' ', f.read().strip()))
    print(contents)

替代 sed 方法:

sed 's/[[:blank:]][[:blank:]]*/ /g; s/\<2AUK/\n&/g' file

输出:

2AUK20170407000006002840700014DeitzpiascECCSERVICE1 SAPMSSY1 3001ZRFC_ICICI&&ZRFC_ICICI itzpiascs 
2AUK20170407000006002840700014DeitzpiascECCSERVICE1 SAPMSSY1 3001SYSU&&SYSTEM_RESET_RFC_SERVER itzpiascs 
2AUK20170407000007002840700014DeitzpiascECCSERVICE1 SAPMSSY1 3001ZRFC_ICICI&&ZRFC_ICICI itzpiascs
  • s/[[:blank:]][[:blank:]]*/ /g - 抑制空间过多

  • s/\<2AUK/\n&/g - 为每个2AUK添加换行符以获取单独的行

答案 3 :(得分:1)

根据您的数据,您的个人日志条目似乎以ScaleTransform结尾,因此请暂停:

itzpiascs

您的文件将变为:

sed -i -r $'s/itzpiascs\\s+/itzpiascs\\\n/g' your_file.log

您可以删除2AUK20170407000006002840700014DeitzpiascECCSERVICE1 SAPMSSY1 3001ZRFC_ICICI&&ZRFC_ICICI itzpiascs 2AUK20170407000006002840700014DeitzpiascECCSERVICE1 SAPMSSY1 3001SYSU&&SYSTEM_RESET_RFC_SERVER itzpiascs 2AUK20170407000007002840700014DeitzpiascECCSERVICE1 SAPMSSY1 3001ZRFC_ICICI&&ZRFC_ICICI itzpiascs 参数,不要更改文件,或者更改-i之类的内容,以便在更改之前创建原始文件的备份。

编辑:如果你想删除多余的空格,你可以链接另一个替换:

-i.bak

将文件转到:

sed -i -r $'s/\\s+/ /g; s/itzpiascs\\s+/itzpiascs\\\n/g' your_file.log