53

入力ファイルからすべての空白行を削除して、出力ファイルに書き込む必要があります。これが私のデータです。

11216,33,1032747,64310,1,0,0,1.878,0,0,0,1,1,1.087,5,1,1,18-JAN-13,000603221321

11216,33,1033196,31300,1,0,0,1.5391,0,0,0,1,1,1.054,5,1,1,18-JAN-13,059762153003

11216,33,1033246,31300,1,0,0,1.5391,0,0,0,1,1,1.054,5,1,1,18-JAN-13,000603211032

11216,33,1033280,31118,1,0,0,1.5513,0,0,0,1,1,1.115,5,1,1,18-JAN-13,055111034001

11216,33,1033287,31118,1,0,0,1.5513,0,0,0,1,1,1.115,5,1,1,18-JAN-13,000378689701

11216,33,1033358,31118,1,0,0,1.5513,0,0,0,1,1,1.115,5,1,1,18-JAN-13,000093737301

11216,33,1035476,37340,1,0,0,1.7046,0,0,0,1,1,1.123,5,1,1,18-JAN-13,045802041926

11216,33,1035476,37340,1,0,0,1.7046,0,0,0,1,1,1.123,5,1,1,18-JAN-13,045802041954

11216,33,1035476,37340,1,0,0,1.7046,0,0,0,1,1,1.123,5,1,1,18-JAN-13,045802049326

11216,33,1035476,37340,1,0,0,1.7046,0,0,0,1,1,1.123,5,1,1,18-JAN-13,045802049383

11216,33,1036985,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000093415580

11216,33,1037003,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000781202001

11216,33,1037003,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000781261305

11216,33,1037003,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000781603955

11216,33,1037003,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000781615746
4

8 に答える 8

96
sed -i '/^$/d' foo

これはsed、正規表現に一致するすべての行、^$つまりすべての空の行を削除するように指示します。-iフラグはファイルをインプレースで編集します。サポートされていない場合はsed、出力を一時ファイルに書き込んで元のファイルを置き換えることができます。

sed '/^$/d' foo > foo.tmp
mv foo.tmp foo

(空の行だけでなく)空白のみで構成される行も削除する場合は、次を使用します。

sed -i '/^[[:space:]]*$/d' foo

編集:行末の空白も削除します。これも必要だと判断したようです。

sed -i '/^[[:space:]]*$/d;s/[[:space:]]*$//' foo
于 2013-01-28T20:25:42.650 に答える
44
awk 'NF' filename

awk 'NF > 0' filename

sed -i '/^$/d' filename

awk '!/^$/' filename

awk '/./' filename

NFは、空白またはタブのみを含む行も削除しますが、正規表現は削除/^$/しません。

于 2013-05-02T05:56:40.620 に答える
17

grepを使用して、開始アンカー( ^)と終了アンカー($)の間に何もない行を照合します。

grep -v '^$' infile.txt > outfile.txt

空白のみの行を削除したい場合でも、grepを使用できます。この例ではPerl正規表現を使用していますが、他の方法もあります。

grep -P -v '^\s*$' infile.txt > outfile.txt

または、Perl正規表現なし:

grep -v '^[[:space:]]*$' infile.txt > outfile.txt
于 2013-01-28T20:21:37.460 に答える
12
sed -e '/^ *$/d' input > output

空白のみで構成されている(または完全に空である)すべての行を削除します。空白を、タブの表現である[ \t]場所に変更できます。\tシェルまたはsed拡張を実行するかどうかは異なりますが、タブ文字を直接入力できる可能性があります。また、GNUまたはBSDを使用している場合はsed、必要に応じて、オプションを使用してインプレースで編集を行うことができ-iます。


上記のコマンドを実行しても、出力ファイルに空白行があります。理由は何でしょうか?

いくつかの理由が考えられます。空白行がない可能性がありますが、行の終わりに多くのスペースがあるため、ファイルを画面に配置すると空白行があるように見えます。それが問題である場合は、次のようにします。

sed -e 's/  *$//' -e '/^ *$/d' input > output

新しい正規表現は、行の終わりで繰り返される空白を削除します。空白またはタブについては、前の説明を参照してください。

もう1つの可能性は、データファイルがWindowsからのものであり、CRLF行末があることです。Unixは、行末でキャリッジリターンを確認します。空白ではないため、行は削除されません。これに対処する方法は複数あります。信頼できる方法は、( )文字コードの8進数15、別名control-Mまたはキャリッジリターンtrを削除することです。-d\r

tr -d '\015' < input | sed -e 's/  *$//' -e '/^ *$/d' > output

これらのどちらも機能しない場合は、ファイルの最初の2行の16進ダンプまたは8進ダンプ(od -c)を表示する必要があります。これにより、何が問題になっているのかを確認できます。

head -n 2 input | od -c

あなたにとってうまくいかないコメントから判断するsed -iと、あなたはLinux、Mac OS X、またはBSDで作業していません—どのプラットフォームで作業していますか?(AIX、Solaris、HP-UXは比較的妥当な可能性として思い浮かびますが、他にも妥当性の低いものがたくさんあります。)

sed -e '/^[[:space:]]*$/d';などのPOSIX名前付き文字クラスを試すことができます。おそらく動作しますが、保証されていません。あなたはそれを試すことができます:

echo "Hello World" | sed 's/[[:space:]][[:space:]]*/   /'

それが機能する場合、「Hello」と「World」の間に3つのスペースがあります。そうでない場合は、おそらくからエラーが発生しsedます。これにより、コマンドラインでタブを入力する手間を省くことができます。

于 2013-01-28T20:26:00.203 に答える
8
grep . file

grepはファイルを1行ずつ調べます。ドットは、改行文字以外.のものと一致します。したがって、grepからの出力は、単一の改行以外のもので構成されるすべての行になります。

于 2013-01-28T20:38:18.097 に答える
7

awkで

awk 'NF > 0' filename

于 2013-01-29T01:13:18.653 に答える
3

スペースやタブが含まれている場合でも、徹底して行を削除するには、perlで次のようにします。

cat file.txt | perl -lane "print if /\S/"

もちろん、awkとsedに相当するものがあります。行が完全に空白であると想定しないことをお勧め^$ します。

乾杯

于 2013-01-28T20:32:47.237 に答える
2

-i一時ファイルを使用せずにインプレースで編集するsedのオプションを使用できます。

 sed -i '/^$/d' file
于 2013-01-28T20:24:47.517 に答える