sed 便利な文字列処理(空白文字の整理・空白行の削除)

バイオインフォ道場、くまぞうです。

sedを使った便利な文字列処理として空白文字・空白行に関する処理をまとめました。これら空白文字や空白行はフィールドやレコードのセパレータとして使われるので整理は大事です。データファイルなどにスペースやタブが混在していると前処理が大変です。これらの手間で「解析する気分」を一気に失うこともあるので、簡単にできる方法を知っていると役に立つことがあるかもしれませんね。

スポンサーリンク



空白文字の処理

sedを使った空白文字の処理です。

関連記事
sed コマンド 行指定の置換・削除(アドレッシング)
sed コマンド 置換・削除・アドレッシングまとめ
sed コマンド 削除(行番号とパターン)

オススメ記事
正規表現 メタキャラクタ 検索・置換 前編
正規表現 メタキャラクタ 検索・置換 後編
awk 複数行の処理

複数のスペースを1つに変換

1個以上のスペースは(space)(space)*で表現できます。間違いが多いのは、(space)*です。*は「直前の文字を0回以上繰り返し」という意味をもつので、この場合「任意」になってしまいます。

書式

sed -e 's/(space)(space)*/(space)/g'  
# (space)は' '

例 複数のスペースを1つに変換

複数のスペースを1つのスペースに置き替えます。

$ cat sed_space.dat
aaa bbb ccc      # (space)1個。
aaa  bbb ccc     # (space)2個・1個。
aaa   bbb   ccc  # (space)3個。
$ cat sed_space.dat | sed -e 's/  */ /g'
aaa bbb ccc
aaa bbb ccc
aaa bbb ccc

例 複数のスペースを1つに変換(指定間違い)

複数のスペースを1つのスペースに置き替えます。sed(space)*を指定すると、全ての文字の前にスペースが挿入されてしまいます。

$ cat sed_space.dat | sed -e 's/ */ /g' # s/(space)が1個
 a a a b b b c c c 
 a a a b b b c c c 
 a a a b b b c c c 

タブまたはスペースが混在した場合に1つのスペースに変換

タブやスペースは混在することが多くて整形するのが面倒です。1回以上のタブ又はスペースの繰り返しは、[(space)(tab)][(space)(tab)]*で表現できます。(space)と(tab)の順序は関係ありません。端末(コンソール)でタブを直接入力するには、「Ctrlキー」を押しながら「v」・その後「Tabキー」を押します。

書式

sed -e 's/[(space)(tab)][(space)(tab)]*/(space)/g'  
# (space)は' ' (tab)は'    '

例 タブまたはスペースが混在をスペースを1つに変換

複数のスペースを1つのスペースに置き替えます。

$ cat sed_space2.dat 
aaa bbb ccc                  # スペース
aaa	 bbb ccc             # スペース・タブ
aaa		bbb 	ccc  # スペース・タブ混在
$ cat sed_space2.dat | sed -e 's/[         ][      ]*/ /g' 
# []内は(space)(tab)
aaa bbb ccc
aaa bbb ccc
aaa bbb ccc

行末のスペースを削除

行末に不要なスペースが残っていると連結処理などで地味に邪魔になることがあります。行末は$で表現します。「$」直前の空白文字を削除「//」します。

書式

sed -e 's/[(space)(tab)]*$//'  
# (space)は' ' (tab)は'    '

例 行末のスペース・タブを削除

行末のスペース・タブを削除します。

$ cat sed_space3.dat
aaa bbb ccc     # スペース・タブ混在
aaa bbb ccc  	# スペース・タブ混在
aaa bbb ccc	# スペース・タブ混在
$ cat sed_space3.dat | sed 's/[    ]*$//' > sed_space4.dat
# []内は(space)(tab)。結果は、sed_space4.datをエディタで確認。

行の処理 空白行・1行目・最終行

sedを使った空白行の処理です。

空白行を削除

空白行にレコードの区切りなど意味があるときもありますが、無駄な空白行はとても邪魔です。空白行は、/^$/で指定して、sedのdコマンドで削除します。

例 行末のスペース・タブを削除

不要な空白行を削除します。

$ cat sed_space5.dat
aaa bbb ccc


aaa bbb ccc

aaa bbb ccc
$ cat sed_space5.dat | sed -e '/^$/d'
aaa bbb ccc
aaa bbb ccc
aaa bbb ccc

1行目・最終行を削除

1行目は不要なヘッダーがあったり、最終行は単なる空白行だったり、1行目と最終行は削除することも多いです。sedのdコマンドで行番号を指定して削除すると簡単です。

例 1行目削除

1行目を削除します。

$ cat sed_space6.dat
1 aaa bbb ccc
2 aaa bbb ccc
3 aaa bbb ccc
$ cat sed_space6.dat | sed -e '1d'
2 aaa bbb ccc
3 aaa bbb ccc

例 最終行削除

最終行目を削除します。最終行の指定は$です。

$ cat sed_space6.dat
1 aaa bbb ccc
2 aaa bbb ccc
3 aaa bbb ccc
$ cat sed_space6.dat | sed -e '$d'
1 aaa bbb ccc
2 aaa bbb ccc

人気記事
シェルスクリプト ファイル存在チェック・空のファイルチェック
R 使い方 軸と目盛りの調整まとめ グラフの描き方
R 使い方 集計に便利な関数 aggregate

スポンサーリンク



One thought to “sed 便利な文字列処理(空白文字の整理・空白行の削除)”

コメントは受け付けていません。