2017-04-26 52 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