2017-04-26 54 views
1

我有这样一个文件中的以下行条目:拆分行条目/ sed的

10120000522012000060 
10120000522012006544 
10120000522012054444 
.... 

,我想的条目变成

1012000052 2012000060 
1012000052 2012006544 
1012000052 2012054444 
.. 

在第10个字符后分割条目并在其中插入标签。 有没有一种快速的方法来做到这一点sed/awk?我的文件是5GB,并且它在Python中耗时过长。

+0

我已经投票决定关闭这个问题,因为它似乎是要求提供工具或解决方案的建议,而不是请求协助您自己的代码。这使您的问题脱离了StackOverflow。如果该评估不正确,并且确实需要帮助调试您自己的'bash','awk'或'sed'代码,那么请[将您的工作添加到您的问题中](http://stackoverflow.com/posts/zh-cn//43645803 /编辑),我会很高兴地收回我的近距离投票。 – ghoti

回答

3

使用sed这应该是比你的Python脚本快得多:

sed -E 's/^(.{10})/\1\t/' file 
1

在TD字符串的结尾这样做

cat infile | tr -d '\t\n\r\f ' | sed 's/.\{10\}/& /g' > outfile 

照顾的空间。

它将首先删除所有空格,然后每10个字符添加它们。

编辑。您可能需要添加其他空格也...

2

或Perl:多更快

perl -pE 's/(.{10})/$1\t/' 

为正则表达式的解决方案:

perl -pE 'substr($_,10,0) = "\t"' 

基准:

#sed regex 
yes 10120000522012000060 | head -10000000 | time sed -E "s/^(.{10})/\1\t/" >/dev/null 
7.38 real   7.34 user   0.03 sys 

#same in perl 
yes 10120000522012000060 | head -10000000 | time perl -pE 's/^(.{10})/$1\t/' >/dev/null 
11.56 real  11.37 user   0.11 sys 

#perl substr 
yes 10120000522012000060 | head -10000000 | time perl -pE 'substr($_,10,0) = "\t"' >/dev/null 
2.52 real   2.40 user   0.07 sys 

明确赢家 :)

+0

你不需要-n和-p。 -p就足够了:)另外,我的sed时间比较少,可以与perl相比。 – grail

+0

@grail omg ...当然。谢谢:) – jm666

+0

@ jm666你会介意添加awk(请参阅http://stackoverflow.com/a/43647748/1745001)时间到您的答案只是为了完整?它似乎比我的机器上的perl版本慢一点。 –

1
gawk 'BEGIN{FIELDWIDTHS="10 10"}{print $1,"\t"$2}' file 

1012000052 2012000060 
1012000052 2012006544 
1012000052 2012054444 
2
$ awk '{print substr($0,1,10) "\t" substr($0,11)}' file 
1012000052  2012000060 
1012000052  2012006544 
1012000052  2012054444 
0

如果要修改原文件,你可以这样做:如果你想创建另一个文件

sed -i -E "s/(.{10})/\1\t/" data 

,您可以使用此:

sed -E "s/(.{10})/\1\t/" data > new_data