首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Unix中将txt编辑为xls?

如何在Unix中将txt编辑为xls?
EN

Unix & Linux用户
提问于 2019-11-26 14:05:15
回答 1查看 111关注 0票数 0

我想把我的txt文件转换成xls/csv。

第一行应打印日期时间,第二行应打印剩余的所有数据(下面示例中从tid到表)

当m使用以下命令时

代码语言:javascript
复制
awk 'BEGIN{ OFS="\t"; print "DateTime,Error"}; NR > 1{print $1,$2;}' TMP.txt > Output.xls

它的打印日期时间在第一行,但只在下一列打印tid。

有谁能帮我在第二栏中打印出其余的全部文字?

在文本文件中记录:

代码语言:javascript
复制
2019-11-26T11:51:32.087-08:00 tid: JCA-work-instance:AQ Adapter-8 userId:  0 , APP: Service Bus Logging FlowId: 0000MtDbHiu8pmk5Szd9ic1TlVox0015xl RouteNode2, null, null, REQUEST Queried data from header table

还应考虑下列类型的日志条目:

代码语言:javascript
复制
Nov 28, 2019 8:19:03 AM PST HTTP BEA-101019 [ServletContext[text] Servlet failed with an IOException. 
Nov 28, 2019 8:22:40 AM PST [null, null, null, ERROR] error in service-callouterror service to get information
EN

回答 1

Unix & Linux用户

发布于 2019-11-26 14:22:18

您所看到的行为的原因是,默认情况下,awkWHITESPACE (即空格、选项卡)视为输入字段分隔符。因此,输入文件中被空间包围的每一项都被视为一个“字段”,并分配给它自己的$内部变量。但是,awk命令指示awk只打印前两个这样的字段($1$2),在您的示例中,这两个字段是日期/时间字符串和文字tid:

在您的特定情况下,最简单的方法可能是使用sed来用制表器替换第一个空白,这将提供所需的结果。

由于您还希望包含一个标题行,下面的内容应该可以工作(假设使用的是GNU sed ):

代码语言:javascript
复制
sed -e '1 i\DateTime\tError' -e 's/ /\t/' TMP.txt > Output.txt

第一个表达式在行的开头插入一行文本,第二个表达式执行预期的“实际格式”。

<#>更新

对于您提供的额外字符串格式,我将使用awk而不是sed (注意,我使用GNU ):

代码语言:javascript
复制
awk 'BEGIN{printf("DateTime\tError\n")} {match($0,"^([[:alpha:]]{3}[[:space:]]+[0123]?[[:digit:]],[[:space:]]+20[[:digit:]]{2}[[:space:]]+[01]?[[:digit:]]:[012345][[:digit:]]:[012345][[:digit:]][[:space:]]+[AP]M[[:space:]]+[[:alpha:]]+)[[:space:]]+([[:print:]]*)$", fields); printf("%s\t%s\n", fields[1], fields[2])}' TMP.txt > Output.txt

这个正则表达式匹配由您指定的时间格式,然后是一个或多个空格,然后是任意可打印的字符,直到行尾,然后打印第一个(...)子组、时间戳,然后是\t,然后是第二个(...)子组,即“行的其余部分”。此外,BEGIN锚点用于在顶部插入标题行。

因为这两种情况都可以发生在同一个文件中,所以我们必须将它们合并到一个awk程序中:

代码语言:javascript
复制
BEGIN {
    printf("DateTime\tError\n");
}

{
if (match($0,"^([[:alpha:]]{3}[[:space:]]+[0123]?[[:digit:]],[[:space:]]+20[[:digit:]]{2}[[:space:]]+[012]?[[:digit:]](:[012345][[:digit:]]){2}[[:space:]]+[AP]M[[:space:]]+[[:upper:]]+)[[:space:]]+([[:print:]]*)$", fields) == 0)
    match($0,"^(20[[:digit:]]{2}-[01][[:digit:]]-[0123][[:digit:]][[:alpha:]][012][[:digit:]](:[012345][[:digit:]]){2}.[[:digit:]]{3}[+-][012][[:digit:]]:[012345][[:digit:]])[[:space:]]+([[:print:]]*)$", fields);

printf("%s\t%s\n", fields[1], fields[3]);
}

您可以调用上面的脚本xlsconvert.awk,然后将其称为

代码语言:javascript
复制
user@host$ awk -f xlsconvert.awk TMP.txt > Output.txt

注意,这当然会在输出中保留不同的时间戳格式。如果要将其转换为统一格式,则可能需要使用shell脚本。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/554231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档