このエントリーをはてなブックマークに追加


複数のスペースで区切られている文字列を抜き出す方法

本記事は、cut,awkコマンドで複数のスペースで区切られた特定の位置の文字列を抜き出す方法について記します。


関連記事

使用するテキストデータ(スペースインデント)

以下のようなスペースインデントされたテキストファイルを使用します。

redhat      centos      fedora
debian      ubuntu      mint
windows10   windows8.1  windows7
freebsd     netbsd      openbsd
hp-ux       solaris     aix

awkを使って特定位置の文字列を抜き出す

awkの場合は、スペースが続いていても気にする必要はありません。
以下のコマンド例は2番目の文字列を抜き取ることができます。

cat sp.txt | awk '{ print $2 }'
centos
ubuntu
windows8.1
netbsd
solaris

print $2 の $2を$1にすれば1番目の文字列を抽出します。
$3にすれば3番目の文字列を抽出することができます。
順番を逆にするのであれば、以下のようにすれば実現できます。

$ cat sp.txt | awk '{ print $3" "$2" "$1 }'
fedora centos redhat
mint ubuntu debian
windows7 windows8.1 windows10
openbsd netbsd freebsd
aix solaris hp-ux

cutを使って特定位置の文字列を抜き出す

文字列と文字列の区切りにスペースが複数あるので、連続するスペースを1つのスペースにするため、
trコマンドを使用します。
trの-sオプションを使い、複数スペースを一つのスペースに変換させます。
その後、cutコマンドで区切り文字にスペースを指定し2番目のフィールドを抽出しています。

$ cat sp.txt | tr -s ' ' ' ' | cut -d" " -f 2
centos
ubuntu
windows8.1
netbsd
solaris

trの-sオプションがわかりづらいと思いますので、以下のようにしても実現できます。
trの-sオプションを使って、複数スペースを,に置換してみます。

  • tr -s コマンドで連続するスペースをカンマに置換します。
    cat sp.txt | tr -s ' ' ,
    redhat,centos,fedora
    debian,ubuntu,mint
    windows10,windows8.1,windows7
    freebsd,netbsd,openbsd
    hp-ux,solaris,aix
     
    -cutコマンドで区切り文字にカンマを指定し3番目の文字列(フィールド)を抽出します。
     cat sp.txt | tr -s ' ' , | cut -d , -f 3
     fedora
     mint
     windows7
     openbsd
     aix

上記の通り、trとcutを組み合わせることにより、連続するスペースを一つのスペースにしたり、
カンマに置換し、cutコマンドにより指定した位置(フィールド)の文字例を抽出することができます。

tabの場合

redhat  centos  fedora
debian  ubuntu  mint
windows10   windows8.1  windows7
freebsd netbsd  openbsd
hp-ux   solaris aix

tabの場合は、以下のようにすればcutで実現できます。
awkの場合は、スペースもタブの同じ動作になります。

$ cat tab.txt | tr -s '\t' ','
redhat,centos,fedora
debian,ubuntu,mint
windows10,windows8.1,windows7
freebsd,netbsd,openbsd
hp-ux,solaris,aix
$ cat tab.txt | tr -s '\t' ',' | cut -d, -f2
centos
ubuntu
windows8.1
netbsd
solaris

スペースとtabの混在

スペースとtabの混在は以下のようにして連続するスペースまたはtabを1つの文字に置換します。
以下の例ではカンマに置換しています。

$ cat sptab.txt | tr -s '\t' ' ' | tr -s ' ' ','
redhat,centos,fedora
debian,ubuntu,mint
windows10,windows8.1,windows7
freebsd,netbsd,openbsd
hp-ux,solaris,aix

上記のような出力になれば、あとは、上述のようにcutを使えば指定した文字列を抽出することができます。
ちなみにawkの場合、スペースとtabが混在していても、以下のように指定した位置(フィールド)の文字列を抽出することができます。

cat sptab.txt | awk '{ print $2 }'
centos
ubuntu
windows8.1
netbsd
solaris

以上、awkとcutコマンドを使用し複数のスペースで区切られている文字列を抜き出すコマンド実行例の紹介でした。



添付ファイル: filesp.txt 658件 [詳細] filetab.txt 519件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-12-16 (土) 02:33:07