#author("2017-12-16T02:23:40+09:00","","")
#navi(../)
* 複数のスペースで区切られている文字列を抜き出す方法 [#u1c3f823]
本記事は、cut,awkコマンドで複数のスペースで区切られた特定の位置の文字列を抜き出す方法について記します。

#contents
#htmlinsertpcsp(linux_ads_top.html,linux-sp.html)

* 関連記事 [#r19615a2]
-[[特定のカラムを削除し表示する・awkコマンド>逆引きシェルスクリプト/特定のカラムを削除し表示する・awkコマンド]]
-[[特定のカラムを削除し表示する・awkコマンド>逆引きシェルスクリプト/特定のカラムを削除し表示する・awkコマンド]]
-[[awkコマンドの区切り文字をカンマに変更>逆引きシェルスクリプト/awkコマンドの区切り文字をカンマに変更]]
-[[awkの出力をカンマ区切りにする方法>逆引きシェルスクリプト/awkの出力をカンマ区切りにする方法]]
-[[指定したフィールドを取り出す・cut>逆引きUNIXコマンド/指定したフィールドを取り出す・cut]]
-[[複数スペースが区切りとなっているファイルをCSVに変換する>逆引きUNIXコマンド/複数スペースが区切りとなっているファイルをCSVに変換する]]
* 使用するテキストデータ(スペースインデント) [#j67bf20f]
以下のようなスペースインデントされたテキストファイルを使用します。
#ref(sp.txt)
 redhat      centos      fedora
 debian      ubuntu      mint
 windows10   windows8.1  windows7
 freebsd     netbsd      openbsd
 hp-ux       solaris     aix

* awkを使って特定位置の文字列を抜き出す [#af6f8f4a]
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を使って特定位置の文字列を抜き出す [#vdc0362a]
文字列と文字列の区切りにスペースが複数あるので、連続するスペースを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
#br
 -cutコマンドで区切り文字にカンマを指定し3番目の文字列(フィールド)を抽出します。
  cat sp.txt | tr -s ' ' , | cut -d , -f 3
  fedora
  mint
  windows7
  openbsd
  aix

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

* tabの場合 [#r909e44f]
#ref(tab.txt)
 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の混在 [#odb216e4]
スペースと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コマンドを使用し複数のスペースで区切られている文字列を抜き出すコマンド実行例の紹介でした。

#htmlinsertpcsp(linux_ads_btm.html,linux-sp.html)


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS