web-dev-qa-db-ja.com

Unixファイルから空白行を削除する方法

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

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
43
Teja
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
86
Jonathan Wakely
awk 'NF' filename
awk 'NF > 0' filename
sed -i '/^$/d' filename
awk '!/^$/' filename
awk '/./' filename

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

36
Jotne

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
15
gpojd
sed -e '/^ *$/d' input > output

空白のみで構成される(または完全に空の)行をすべて削除します。空白を[ \t]に変更できます。\tはタブの表現です。シェルまたはsedが展開するかどうかは異なりますが、おそらくタブ文字を直接入力できます。 GNUまたはBSD sedを使用している場合は、-iオプションを使用して、その場で編集することができます。


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

いくつかの理由が考えられます。空白行はないかもしれませんが、行末にたくさんのスペースがあるので、ファイルを画面に表示するときに空白行があるように見えます。それが問題であれば、次のようにします。

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

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

もう1つの可能性は、データファイルがWindowsから来ており、CRLFの行末があることです。 Unixでは、行末に復帰が表示されます。空白ではないため、行は削除されません。それに対処する方法は複数あります。信頼できるのは、tr-d)文字コード8進数15、別名control-Mまたは\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からエラーを受け取ります。これにより、コマンドラインでタブを入力する手間を省くことができます。

12
grep . file

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

8
Ed Morton

awkで

awk 'NF > 0' filename

5
Mirage

Sedの-iオプションを使用して、一時ファイルを使用せずにその場で編集できます。

 sed -i '/^$/d' file
2
P.P.

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

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

もちろん、awkとsedに相当するものがあります。 ^$が行うように、行がtotallyであると仮定しないことが最善です。

乾杯

2
G. Cito