他のすべての列を結合するには、sedまたはawkを使用します。

他のすべての列を結合するには、sedまたはawkを使用します。

次の形式の大きなテキストファイル(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

関連情報