我有一個大文字檔案(666000 列),格式為
A B C D E F
所需輸出
AB CD EF
我們怎樣才能在sed
or中做到這一點awk
?我嘗試了幾件事,但似乎沒有任何效果。請建議一些東西。
答案1
在sed
:
sed 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file
這將進行替換並將結果列印到標準輸出。若要就地修改文件,請新增-i
開關:
sed -i 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file
解釋
此sed
命令將尋找一個空格,後面跟著至少一個非空格字符,最後跟著一個空格或行尾。它用它找到的任何非空格字元替換該序列,後面跟著一個空格。由於g
修飾符是在末尾提供的,因此替換會在整行中應用盡可能多次(這稱為全域替換) 。因此,基本上,對於像這樣的序列A B C
,sed
將找到模式“B”並將其替換為“B”,留下AB C
最終結果。
此程式碼所做的假設
例如,此程式碼假設列之間的空格實際上是空格而不是製表符。這可以很容易地解決,但會犧牲可讀性:
sed 's![[:blank:]]\+\([^[:blank:]]\+\)\([[:blank:]]\+\|$\)!\1 !g' your_file
答案2
awk:
awk '{printf $1$2;for(i=3; i<=NF;i+=2){printf " %s",$i$(i+1)}print}' file
對於大檔案來說,這可能是兩者中最快的。
珀爾:
perl -pe 's/([^\s]+)\s+([^\s]+)/$1$2/g' file
答案3
RS
如果您的檔案確實有那麼多列,一種選擇是使用 gawk 透過設定「一個或多個空白字元」將每一列視為一筆記錄。這有助於避免在列中設定循環。請注意,面對一行中的奇數列,此解很脆弱。
awk --re-interval -v RS='[[:space:]]{1,}' '{x=$0; getline; printf x$0RT}' file