スペースが挿入された単語のリストを含む(潜在的に非常に大きい)テキストファイルがあるとしましょう。たとえば、次のようになります。
Cat Dog
Soup Rat
Cass Audrey
次のように、各単語をスペースなしで別々の行に表示したいと思います。
Cat
Dog
Soup
Rat
Cass
Audrey
簡単にtr -d " "
次のように変更できます。
CatDog
SoupRat
CassAudrey
(しかしそれは私が望むものではありません。)
どのタイプのスペースがこの単語を区別するのかわからないため、通常のASCIIスペースとタブの組み合わせであるとします。 (全幅スペースやゼロ幅などの見えないUnicode文字はないと仮定できます。)当然、これらの単語は存在しません。含む空白なので、「à la」、「alma mater」、「appleie」、「at free」、「icecream」は有効な単語ではありません。
単語に「AC/DC」、「add-on」、「AT&T」、「audio-video」、「can't」、「carbon-14」などのアルファベット以外の文字(スペースではない)を含めることができる仮定します。 , "jack-o'-lantern" ", "義母", "o'clock", "O'Reilly", "RS-232", "3-D". 理想的には、ソリューションは "Ångström", "Gödel" 、「naïve」、「résumé」、「smörgåsbord」などの非ASCII文字を許可する必要があります。
tr
sed
などの一般的なUnix / Linuxツールを使用したり、インデントされた単語を保持(および分離)しながらこれらのスペースをすべて削除するにはどうすればよいですかawk
?
この解決策が言及されている問題のより一般的な場合でも効果がある場合は良いでしょう。つまり、2つのテキスト列だけでなく、次のランダムな配列にも適用されます。
Once upon
a midnight
dreary
while I pondered
weak and weary
Over many
a quaint and curious volume
of forgotten lore
答え1
etopylightはほぼ正しいです。
tr -s ' \t' '\n'
質問では、タブの交換も要求するからです。
答え2
デフォルトでは、GNUはこれを行うことができますsed
。
sed 's/\s\+/\n/g'
それではそうします...
答え3
あなたは利用可能でなければなりません
sed -e 's/[[:space:]]\{1,\}/\n/'
1つ以上の空白文字(フォームフィードや垂直タブなどの奇数文字を含む)のシーケンスを単一の改行文字に置き換えます。
答え4
awkのデフォルトの動作はすでに空白(空白、タブ)の数に関係なく分割することなので、その機能も使用できます。出力フィールドの区切り文字を「\ n」に設定して$ 0を再構築するだけです。しかし、このタスクの一般的な質問の1つは、空行をどのように処理しますか?
そのまま印刷してください。
awk -v OFS='\n' '{$1 = $1; print}' file
空白行をさらにフィルタリングするには:
awk -v OFS='\n' 'NF {$1 = $1; print}' file
(しかし、Linuxの設定では、Windows行の末尾(\ rを含む)に注意してください。awkは必ず\ rのある行を空行として扱わず、この場合は空行も出力されます。してくださいdos2unix
。