我在這個格式的大文件〜9GB,每行:拆分的空間列到兩列
12345,6789,Jim Bob
我所需的輸出是這樣的:
12345,6789,Jim,Bob
我會怎麼做這使用awk
。這似乎是處理這個問題的最快方法,而我在使用終端進行此類工作時是新的。謝謝!
我在這個格式的大文件〜9GB,每行:拆分的空間列到兩列
12345,6789,Jim Bob
我所需的輸出是這樣的:
12345,6789,Jim,Bob
我會怎麼做這使用awk
。這似乎是處理這個問題的最快方法,而我在使用終端進行此類工作時是新的。謝謝!
使用AWK和正則表達式來替換用逗號第一空間:
$ awk '{sub(/ /,",")}1' file
12345,6789,Jim,Bob
,或者使用AWK和正則表達式與在第三字段中的逗號($3
)來代替空間:
$ awk 'BEGIN{FS=OFS=","}{sub(/ /,",",$3)}1' file
12345,6789,Jim,Bob
另一種解決方案使用awk
awk '$1=$1' OFS=, file
你得到,
12345,6789,Jim,Bob
什麼是OFS,以便我瞭解未來? –
@DmitryPolonskiy OFS =輸出字段分隔符[輸出分隔符](https://www.gnu.org/software/gawk/manual/html_node/Output-Separators.html) –
沒有想到這一點。 ++ –
我有一種感覺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
sed
比awk
快2倍!對於9G文件,這種差異可能更加劇烈。
對於一個36MB的文件,對我來說,這是相反的[查看測試這裏](http://i.imgur.com/DurPfih.png)....'awk'比'sed'快兩倍。 ...我發現它更合理,因爲它不使用'正則表達式' –
確認,這是更快的方法! –
即使你想要速度,那麼我認爲沒有什麼比'tr'''快,'
那麼你可以使用 '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
完美,謝謝!我會在10分鐘過後再接受。 –