我在 unix 中有一个表,格式如下,并隐藏为输出。
+--------------------------+-------------------------+-+
| col_name | type |
+--------------------------+-------------------------+-+
| Name | String |
| Date | Fri 29 13:17:2020 |
+--------------------------+-------------------------+-+
输出:
"col_name","type"
"Name","String"
"Date","Fri 29 13:17:2020"
任何帮助,将不胜感激。
答案1
尝试这个:
input ()
{
cat <<EOF
+--------------------------+-------------------------+-+
| col_name | type |
+--------------------------+-------------------------+-+
| Name | String |
| Date | Fri 29 13:17:2020 |
+--------------------------+-------------------------+-+
EOF
}
input |
tr -d '|+-' | # remove decoration
grep -v ^$ | # remove empty lines
while read first rest; do # read first token and rest of the line
printf '"%s","%s"\n' \
"$first" "$rest" # format as required
done
答案2
源代码看起来像是控制台中对 dbase 客户端的响应。但是行尾和大量空格丢失了,可能是用记事本打开 unix 文本时丢失的。使用原始格式(不成比例的字体),源可以形成一个漂亮的表格。
+--------------------------+-------------------------+-+
| col_name | type |
+--------------------------+-------------------------+-+
| Name | String |
| Date | Fri 29 13:17:2020 |
+--------------------------+-------------------------+-+
在十六进制编辑器中查看文本文件,看看它的真正内容是什么。您可以编写一个命令将其转换为请求的形式。 (按照格式,不能写成注释,这到底是什么)
答案3
以下awk
程序应该可以完成这项工作,前提是所有字段值都不能包含引号(结果将是不合格的 CSV):
awk -F'|' -v OFS="," '/^\+/{next} {for (i=2;i<NF;i++) {gsub(/^ *| *$/,"",$i); printf("\"%s\"%s",$i,i<(NF-1)?OFS:ORS)}}' input.txt
这会
- 视为
|
字段分隔符 - 忽略以以下内容开头的任何行
+
|
忽略那些不以 开头的行的第一个和最后一个“字段”(它们是空的,因为它们是第一个之前和最后一个之后的“内容” )+
,并打印剩余的字段,删除空格并用双引号括起来引号,带有,
字段分隔符。
假设单元格内的任何前导和尾随空格纯粹是装饰,并且输入文件不包含空行。