首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >命令,用于将行转换为CSV文件。

命令,用于将行转换为CSV文件。
EN

Unix & Linux用户
提问于 2019-07-16 06:05:37
回答 2查看 2.1K关注 0票数 3

我有一个格式的文件,每一行前面都有一个前导空格:

代码语言:javascript
复制
 "Western Overseas",
 "Western Overseas",
 "^",
 "--",
 "^",
 "--",
 "--",
 null,
 24995,
 9977,
 "CR",

 "Western Refrigeration Private Limited",
 "Western Refrigeration Private Limited",
 "[ICRA]A",
 "--",
 "[ICRA]A1",
 "--",
 "Stable",
 null,
 14951,
 2346,
 "CR",

我想把它转换成一个格式为CSV的文件:

代码语言:javascript
复制
 "Western Overseas","Western Overseas","^","--","^","--","--",null,24995,9977,"CR"
 "Western Refrigeration Private Limited","Western Refrigeration Private Limited","[ICRA]A","--","[ICRA]A1","--","Stable",null,14951,2346,"CR"

我正在尝试使用tr,但遇到了问题,因为它要么将所有输出打印到一行中,要么用双换行符替换换行符。任何帮助都是非常感谢的。

EN

回答 2

Unix & Linux用户

发布于 2019-07-16 10:53:48

awk解决方案是

代码语言:javascript
复制
awk '{if(NF){gsub(/^ |,$/,""); printf c $0; c=","}else{printf "\n"; c=""}};END{printf "\n"}'

经评论后扩大:

代码语言:javascript
复制
{
    if(NF) { # if the line isn't empty
        gsub(/^ |,$/,""); # remove the first space and last comma
        printf c $0; # print the line (without a newline)
        c="," # set c to add a comma for the next field
    } else {
        printf "\n"; # empty line, output a newline
        c="" # don't print a comma for the next entry
    }
};
END {
    printf "\n" # finish off with a newline
}
票数 4
EN

Unix & Linux用户

发布于 2019-07-16 08:02:20

代码语言:javascript
复制

第一个sed循环(:start、b start)并将行附加到其模式空间(N),直到找到并删除最末端的换行符(s/\n$//)为止。这表示读取了空行,该工具退出循环,然后(t)。在每次迭代时,任何幸存的换行符(和一个连续的空格)都会被删除,以连接行(s/\n //)。

第二个sed移除后面的逗号。

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

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

复制
相关文章

相似问题

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