使用 sed 或 awk 連接所有其他列

使用 sed 或 awk 連接所有其他列

我有一個大文字檔案(666000 列),格式為

A B C D E F

所需輸出

AB CD EF

我們怎樣才能在sedor中做到這一點awk?我嘗試了幾件事,但似乎沒有任何效果。請建議一些東西。

答案1

sed

sed 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file

這將進行替換並將結果列印到標準輸出。若要就地修改文件,請新增-i開關:

sed -i 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file

解釋

sed命令將尋找一個空格,後面跟著至少一個非空格字符,最後跟著一個空格或行尾。它用它找到的任何非空格字元替換該序列,後面跟著一個空格。由於g修飾符是在末尾提供的,因此替換會在整行中應用盡可能多次(這稱為全域替換) 。因此,基本上,對於像這樣的序列A B Csed將找到模式“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

相關內容