次の形式の大きなテキストファイル(666000列)があります。
A B C D E F
希望の出力
AB CD EF
sed
またはでどのようにこれを行うことができますかawk
?いくつか試してみましたが、何も動作しないようです。何かを提案してください。
答え1
存在するsed
:
sed 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file
その後、置換が実行され、結果が標準出力として印刷されます。ファイルを変更するには、-i
スイッチを追加してください。
sed -i 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file
説明する
このsed
コマンドは、空白、空白ではなく、1 つ以上の文字、最後に空白、または行末を探します。シーケンスを見つかった空白以外の文字に置き換え、その後に空白が続きます。g
修飾子は最後に提供されるため、置換は行全体にわたって可能な限り適用されます(これをグローバル置換と呼びます)。したがって、基本的に、このようなシーケンスの場合、A B C
パターンsed
「B」が発見され、「B」に置き換えられ、AB C
最終結果が残る。
このコードの仮定
たとえば、このコードでは、列間の空白が実際にはタブではなく空白であるとします。この問題は簡単に解決できますが、読みやすさが低下します。
sed 's![[:blank:]]\+\([^[:blank:]]\+\)\([[:blank:]]\+\|$\)!\1 !g' your_file
答え2
奇妙な:
awk '{printf $1$2;for(i=3; i<=NF;i+=2){printf " %s",$i$(i+1)}print}' file
大容量ファイルの場合、この方法はおそらく2つのうち最も速い方法です。
真珠:
perl -pe 's/([^\s]+)\s+([^\s]+)/$1$2/g' file
答え3
RS
ファイルに多くの列がある場合、1つのオプションはgawkを使用して「1つ以上の空白文字」を設定して各列をレコードとして処理することです。これにより、列にループを設定するのを防ぐことができます。この解決策は、連続して奇数列に直面すると脆弱であることに注意してください。
awk --re-interval -v RS='[[:space:]]{1,}' '{x=$0; getline; printf x$0RT}' file