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