我有以下数据表:
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如果小数点数存在,我将丢弃小数,并包含没有“#”的描述。
我将数据看作是一组字段(请原谅伪正则表达式):
^{1}\s+{2}/{3}\s+{4}\s+# {5}$ 为此,我将输出:
{1},{2},{3},{5} 做这件事的最简单和最合适的工具是什么?我将非常感谢在语法方面的帮助来实现这一点。
发布于 2016-11-10 15:00:24
这样的最好工具可能是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 Newss:::使用冒号作为表达式分隔符。^([^ ]*)第一捕获组,在行的开头匹配非空格字符的序列。\s+忽略空间([^/]*)第二个捕获组,匹配一个斜杠/忽略斜杠([^ ]*)第三捕获组,非空间字符匹配序列\s+忽略空间[^ ]*忽略十进制数\s*#?\s*忽略空间和可选散列(.*)第四捕捉组,剩下的线https://unix.stackexchange.com/questions/322339
复制相似问题