sedまたはawkを使用して1列おきに結合する

sedまたはawkを使用して1列おきに結合する

次のような形式の大きなテキストファイル(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 つの非スペース文字、それに続くスペースまたは行末を検索します。このコマンドは、このシーケンスを、見つかった非スペース文字とそれに続く 1 つのスペースに置き換えます。最後に修飾g子が指定されているため、置換は行全体で可能な限り多く適用されます (これをグローバル置換と呼びます)。つまり、基本的に、 のようなシーケンスでは、A B Cパターン" B " が検索され、それが "B " に置き換えられ、最終結果としてsedが残ります。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 
    

    大きなファイルの場合、おそらくこれが 2 つのうち最も高速になります。

  • パール:

    perl -pe 's/([^\s]+)\s+([^\s]+)/$1$2/g' file
    

答え3

ファイルに実際にそれだけの列がある場合、1 つのオプションは、gawk を使用してRS「1 つ以上の空白文字」に設定し、各列をレコードとして扱うことです。これにより、列をループする必要がなくなります。このソリューションは、行内の列数が奇数の場合に脆弱であることに注意してください。

awk --re-interval -v RS='[[:space:]]{1,}' '{x=$0; getline; printf x$0RT}' file

関連情報