在特定索引处添加分隔符

Cir*_*rco 4 regex awk sed

我想在文件的每一行的某些索引中添加分隔符.

我有一个包含数据的文件:

10100100010000
20200200020000
Run Code Online (Sandbox Code Playgroud)

我知道每列的偏移量(2,5和9)

使用此sed命令: sed 's/\(.\{2\}\)/&,/;s/\(.\{6\}\)/&,/;s/\(.\{11\}\)/&,/' myFile

我得到了预期的输出:

10,100,1000,10000 
20,200,2000,20000
Run Code Online (Sandbox Code Playgroud)

但是有大量的列(~200)和行(300k)真的很慢.

有没有有效的替代方案?

Rav*_*h13 8

第一个解决方案:有了GNUawk,请试试以下.

awk -v OFS="," '{$1=$1}1' FIELDWIDTHS="2 3 4 5"  Input_file
Run Code Online (Sandbox Code Playgroud)

第二个解决方案:使用sedtry follow.

sed 's/\(..\)\(...\)\(....\)\(.....\)/\1,\2,\3,\4/' Input_file
Run Code Online (Sandbox Code Playgroud)

第三溶液: awk溶液中使用substr.

awk 'BEGIN{OFS=","} {print substr($0,1,2) OFS substr($0,3,3) OFS substr($0,6,4) OFS substr($0,10,5)}' Input_file
Run Code Online (Sandbox Code Playgroud)

在上面的substr解决方案中,我已经取了5个数字/字符,substr($0,10,5)以防你想要从第10个位置开始使用所有字符/数字等,substr($0,10)这将使其余的所有行的字符/数字在这里打印.

输出如下.

10,100,1000,10000
20,200,2000,20000
Run Code Online (Sandbox Code Playgroud)


Aar*_*ron 5

修改你的sed命令使它一次性添加所有分隔符可能会使它表现更好:

sed 's/^\(.\{2\}\)\(.\{3\}\)\(.\{4\}\)/\1,\2,\3,/' myFile
Run Code Online (Sandbox Code Playgroud)

或者使用扩展正则表达式:

sed -E 's/(.{2})(.{3})(.{4})/\1,\2,\3,/' myFile
Run Code Online (Sandbox Code Playgroud)

输出:

10,100,1000,10000
20,200,2000,20000
Run Code Online (Sandbox Code Playgroud)