2017-02-16 6 views
0

一部のテキストファイルからすべての空白行を削除します。私はそれを行うことができます。テキストファイルの空白を削除するには?

grep '[^[:blank:]]' <file1.dat> file1.dat.nospace

しかし、私はディレクトリ内のn-ファイルでそれを行う必要があります。どうしたらいいですか?

ご協力いただければ幸いです。ありがとう!

答えて

1

は道である:ここ

for filename in *.dat; do 
    grep '[^[:blank:]]' < $filename > $filename.nospace 
done 

より堅牢な方法があり、より多様な状況で動作するもの:

find . -maxdepth 1 -type f -name "*.dat" | while read filename; do 
    grep '[^[:blank:]]' < "$filename" > "$filename.nospace" 
done 

ここでは、はるかに高速な方法です(実行時にもタイピングでも)。これは私が実際にそれを行うだろう方法です:

ここ
find *.dat -printf "grep '[^[:blank:]]' < \"%f\" > \"%f.nospace\"\n" | sh 

は、より堅牢なバージョンです:

find . -maxdepth 1 -type f -name "*.dat" -printf "grep '[^[:blank:]]' < \"%f\" > \"%f.nospace\"\n" | sh 

PS:ここでは空白でない行の実際の正しいグレップです:

grep -v '^$' < $filename > $filename.nospace 
+0

単純な 'sed'コマンドを使って' grep'を実行できるのはなぜですか?下の私の答えを見てください。 – anubhava

+0

これは私が探していたものです、ありがとう! – NicolasG

+2

行が空白で始まる場合にのみ、これは実際に空白行をチェックしていないことに注意してください。 –

3

あなたはおそらくあなたを助けることができるfind

find . -name '*.dat' -exec sed -i.bak '/^[[:blank:]]*$/d' {} + 
+0

これは要求された結果を与えません - それはサブディレクトリに降りて、新しい '.nospace'を作るのではなくオリジナルの名前を.bak'に変更します。それは一般的にはより優れたテクニックであり、私はそれを私の答えの3倍の速さでベンチマークしました(3秒対7000ファイルの9秒、合計73MB)。 – webb

+0

@webbいいえファイルの名前を変更しません。 OPが元のファイルにアクセスしたがっている何かがうまくいかない場合、シナリオのための拡張子が.bakのオリジナルファイルを保持するだけです。 – anubhava

+0

サブディレクトリへの降下を防ぐため、 'find'に' -maxdepth 1'オプションを追加するだけです。 – anubhava

1

このonelinerでそれを使用することができます。

ここ
for a in /path/to/file_pattern*; do sed "/^\s*$/d" $a > $a.nospace;done 
関連する問題