入力ファイルからすべての空白行を削除して、出力ファイルに書き込む必要があります。以下は私のデータです。
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
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
awk 'NF' filename
awk 'NF > 0' filename
sed -i '/^$/d' filename
awk '!/^$/' filename
awk '/./' filename
NFは、空白またはタブのみを含む行も削除しますが、正規表現/^$/
は削除しません。
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
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
からエラーを受け取ります。これにより、コマンドラインでタブを入力する手間を省くことができます。
grep . file
grepはファイルを1行ずつ調べます。ドット.
はすべてに一致します除く改行文字。したがって、grepからの出力は、単一の改行以外のもので構成されるすべての行です。
awkで
awk 'NF > 0' filename
Sedの-i
オプションを使用して、一時ファイルを使用せずにその場で編集できます。
sed -i '/^$/d' file
徹底的に行を削除するにはevenスペースまたはタブが含まれている場合は、Perlで次のようにします。
cat file.txt | Perl -lane "print if /\S/"
もちろん、awkとsedに相当するものがあります。 ^$
が行うように、行がtotallyであると仮定しないことが最善です。
乾杯