通过添加分隔符来拆分长字符串

时间:2014-12-22 17:19:51

标签: unix sed split

我的文件存在问题。 它有3列,最后一列包含一个巨大的文本字段。 它来自Oracle的CLob,所以它可以长达4k ......

我想将它集成到我的Oracle中,但我无法导入该文件。

是否可以在每一行添加一些分隔符来分割那些巨大的线? 让我们说,添加一个' |' (我的分隔符)每200个字符或类似的东西,所以我可以小部分导入小部分?

当线条没有很大的长度时,诀窍是添加连续的分隔符

例如: 原始文件:

12345678910
12345

将被转化为(如果我每5个人有一个字母)

12345|67891|0
12345||

你认为使用perl或sed是否可行? 非常感谢你的帮助。

编辑:只是为了清除它: 我需要在整个文件中使用相同数量的字段。因此,最长的行将定义我的整个文件中每行所需的字段数。文件的文本包含人的句子。

非常感谢你的帮助。

4 个答案:

答案 0 :(得分:1)

echo 12345678901234567890 | sed 's/\(.\{5\}\)/\1|/g'

给出

12345|67890|12345|67890|

调整大括号之间的数字以获得更长的块。

编辑:由于对问题的评论清除了要求,我和awk一起攻击了一些东西,它在第一遍中找到了字段数,并在一秒内拼接了分隔符:

#!/bin/sh

awk -v width=5 '                 # adjust width as required
  BEGIN { maxlen = 0 }
  NR == FNR {                    # first pass
    if(length($0) > maxlen) {
      maxlen = length($0)        # just find the longest line.
    }
    next
  }
  {                              # second pass
    fieldcount = maxlen / width  # splice in separators
    line = ""
    for(i = 0; i < fieldcount; ++i) {
      line = line substr($0, 1 + i * width, width) "|"
    }
    print line                   # then print line.
  }
' foo.txt foo.txt

答案 1 :(得分:0)

sed脚本

sed '
/^.\{0,5\}$/ {
s/\(^.*$\)/&||/g
}
/^.\{5,\}[^|]$/ {
s/.\{5\}/&|/g
} '

sed '/^.\{0,5\}$/ {s/\(^.*$\)/&||/g};/^.\{5,\}[^|]$/ {s/.\{5\}/&|/g}'

如果任何行包含0-5个字符 ,此脚本将添加||,如果该行超过五个字符,则脚本将添加| 该行的每个 5个字符

假设您在名为my_file

的文件中有数字
123456789100986093486084
12345
81638164864
126817
2394
2347
9487298579275934636975697w8
12

命令行

sed '
/^.\{0,5\}$/ {
s/\(^.*$\)/&||/g
}
/^.\{5,\}[^|]$/ {
s/.\{5\}/&|/g
} ' 'my_file'

sed '/^.\{0,5\}$/ {s/\(^.*$\)/&||/g};/^.\{5,\}[^|]$/ {s/.\{5\}/&|/g}' 'my_file'

<强>结果

12345|67891|00986|09348|6084
12345||
81638|16486|4
12681|7
2394||
2347||
94872|98579|27593|46369|75697|w8
12||

脚本如何运作

   /^.\{0,5\}$/ {
    s/\(^.*$\)/&||/g
    }

脚本的第一部分检查所有具有0-5个字符的行。如果为true,则会在这些行的末尾添加||

   /^.\{5,\}[^|]$/ {
    s/.\{5\}/&|/g
    } '

脚本的这一部分会搜索所有包含5个或更多字符且不以||结尾的行,如果找到这些行,则每添加5个字符|

答案 2 :(得分:0)

试试这个。

sed 's/\([0-9]\{5\}\)/\1|/g' file name.

答案 3 :(得分:0)

sed 's/.\{5\}/&|/g;s/^.\{0,4\}/&|||/' YourFile
  • 每5个字符添加|
  • 如果长度为最多4个字符
  • ,则在末尾添加|||