2017-02-14 82 views
0

我在這個格式的大文件〜9GB,每行:拆分的空間列到兩列

12345,6789,Jim Bob 

我所需的輸出是這樣的:

12345,6789,Jim,Bob 

我會怎麼做這使用awk。這似乎是處理這個問題的最快方法,而我在使用終端進行此類工作時是新的。謝謝!

回答

2

使用AWK和正則表達式來替換用逗號第一空間:

$ awk '{sub(/ /,",")}1' file 
12345,6789,Jim,Bob 

,或者使用AWK和正則表達式與在第三字段中的逗號($3)來代替空間:

$ awk 'BEGIN{FS=OFS=","}{sub(/ /,",",$3)}1' file 
12345,6789,Jim,Bob 
+0

完美,謝謝!我會在10分鐘過後再接受。 –

2

另一種解決方案使用awk

awk '$1=$1' OFS=, file 

你得到,

12345,6789,Jim,Bob 
+0

什麼是OFS,以便我瞭解未來? –

+1

@DmitryPolonskiy OFS =輸出字段分隔符[輸出分隔符](https://www.gnu.org/software/gawk/manual/html_node/Output-Separators.html) –

+0

沒有想到這一點。 ++ –

2

我有一種感覺sed會快很多您的需求給定的輸入文件的巨大規模:

sed -E 's/ ([^ ]+)$/,\1/' file > file.modified 

,或者就地編輯:

sed -i.bak -E 's/ ([^ ]+)$/,\1/' file 

使用36 MB文件進行基準對比,dummy.txt:

$ time awk 'BEGIN{FS=OFS=","}{sub(/ /,",",$3)}1' dummy.txt >/dev/null 

real 0m3.357s 
user 0m3.337s 
sys 0m0.016s 

$ time awk '{sub(/ /,",")}1' dummy.txt >/dev/null 

real 0m3.182s 
user 0m3.166s 
sys 0m0.014s 

$ time awk '$1=$1' OFS=, dummy.txt >/dev/null 

real 0m3.150s 
user 0m3.130s 
sys 0m0.018s 

$ time sed -E 's/ ([^ ]+)$/,\1/' dummy.txt >/dev/null 

real 0m1.646s 
user 0m1.633s 
sys 0m0.013s 

sedawk快2倍!對於9G文件,這種差異可能更加劇烈。

+0

對於一個36MB的文件,對我來說,這是相反的[查看測試這裏](http://i.imgur.com/DurPfih.png)....'awk'比'sed'快兩倍。 ...我發現它更合理,因爲它不使用'正則表達式' –

+1

確認,這是更快的方法! –

+0

即使你想要速度,那麼我認爲沒有什麼比'tr'''快,'

0

那麼你可以使用 'TR' 此外,如果適合你

tr -s ' ' ',' <file.txt> tr.txt

其中file.txt的是輸入文件 和tr.txt是輸出文件。

那麼,如果你想AWK只使用,你可以選擇的空間作爲字段分隔符並使用awk打印「」兩列

基準爲283MB的文件進行間

awk -F' ' '{print $1","$2}' file.txt 

使用TR

time tr -s ' ' ',' <file.txt>tr.txt 

real 0m10.976s 
user 0m1.042s 
sys  0m0.966s 

使用AWK

time awk -F' ' '{print $1","$2}' file.txt > /dev/null 

real 0m14.141s 
user 0m13.909s 
sys  0m0.199s 

使用@codeforester方法

time sed -E 's/ ([^ ]+)$/,\1/' file.txt >/dev/null 

real 0m42.183s 
user 0m41.659s 
sys  0m0.435s 

TR工作速度甚至比sed和awk