次のデータテーブルがあります。
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