標準テキスト処理ツールを使用してスペースで区切られたテーブルをCSVに変換する

標準テキスト処理ツールを使用してスペースで区切られたテーブルをCSVに変換する

次のデータテーブルがあります。

ssh     22/tcp  0.182286        # Secure Shell Login
linuxconf   98/tcp  0.000088 
tacnews    98/udp   0.000560    # TAC News

次の形式のCSVファイルを生成したいと思います。

ssh,22,tcp,Secure Shell Login
linuxconf,98,tcp,
tacnews,98,udp,Tac News

10 進数を捨てて「#」がある場合、説明は含まれません。

データを複数のフィールドで表示します(偽の正規表現は許してください)。

^{1}\s+{2}/{3}\s+{4}\s+# {5}$  

これを行うには、次のように出力します。

{1},{2},{3},{5}  

これを行う最も簡単で最も適切なツールは何ですか?これを達成するための構文の助けをいただければ幸いです。

答え1

おそらくこの種の問題を解決するための最良のツールですsed。以下は、拡張正規表現を使用する実際の例です。

sed -E 's:^([^ ]*)\s+([^/]*)/([^ ]*)\s+[^ ]*\s*#?\s*(.*):\1,\2,\3,\4:' file

または、入力内容がタブ区切りの場合:

sed -E 's:^([^[:space:]]*)\s+([^/]*)/([^[:space:]]*)\s+[^[:space:]]*\s*#?\s*(.*):\1,\2,\3,\4:' file

出力:

ssh,22,tcp,Secure Shell Login
linuxconf,98,tcp,
tacnews,98,udp,TAC News

説明する

  • s:::コロンを式の区切り文字として使用
  • ^([^ ]*)行の先頭の空白以外の文字列に一致する最初のキャプチャグループ
  • \s+スペースを無視する
  • ([^/]*)2番目のキャプチャグループはスラッシュと一致します。
  • /スラッシュを無視
  • ([^ ]*)3番目のキャプチャグループは、空白以外の文字のシーケンスと一致します。
  • \s+スペースを無視する
  • [^ ]*小数点を無視
  • \s*#?\s*空白とオプションのハッシュを無視する
  • (.*)4番目のキャプチャグループ、残りの行

答え2

私はPerlを使います。空白を埋める正規表現の概要を説明しました。

perl -lne '
    / (\S+)     \s+      # non-whitespace followed by whitespace
      (\d+)     \/       # digits followed by slash
      (\S+)     \s+      # non-whitespace followed by whitespace
      (\S+)     \s*      # non-whitespace followed by optional whitespace
      (?:\#\s)? (.*)     # possibly a hash+space and whatever follows
    /x and print "$1,$2,$3,$4,$5"' file

関連情報