【问题标题】:Add double quotes each n lines and remove existing line breaks每 n 行添加双引号并删除现有的换行符
【发布时间】:2015-02-14 20:27:05
【问题描述】:

我有一台 Mac,想创建一个 CSV 并用双引号分隔每 5 行的行,然后删除每行中现有的换行符。

例如,我想转换以下文本:

My
Name
is
Michael
I'm
25
Years
Old

转至以下文字:

"My Name is Michael"
"I'm 25 Years Old"

这可以使用 Numbers、TextEdit、任何在线工具、任何免费软件、SED 命令或任何工具来完成吗?

谢谢

【问题讨论】:

  • 您已将文本按每 4 行而不是 5 行划分。

标签: macos csv text sed


【解决方案1】:

使用awk - 在第四行打印连接的字符串s

awk 'BEGIN {n=0;s=""} 
    {
      if (s=="") s=$0; # first field should not have leading space
      else s=s " " $0;

      if (!(++n % 4))  # after 4 lines print concatenated string
      { 
         printf("\"%s\"\n" , s); s="";} 
      }' textfile

【讨论】:

  • 这很好用,但如果剩下 4 行或更少的行,它们根本不会包含在输出中
【解决方案2】:

这不会赢得任何高尔夫比赛,但是:

perl -0777 -pe 's/(.*)\n(.*)\n(.*)\n(.*)\n/"$1 $2 $3 $4"\n/g' input-file

当然有更简洁的方法可以做到这一点,但这至少更通用:

perl -wle 'while(!eof){ undef $a; 
    $a .= <> for(1..4); $a =~ s/\n/ /g; 
    chop $a; print "\"$a\""}' input

【讨论】:

  • 嘿威廉 :) 非常感谢!我可以将其修改为每 50 行而不是 5 行吗? 5 行只是为了演示
  • 这很好用,但如果剩下 4 行或更少的行,它们根本不会包含在输出中
【解决方案3】:

这是一个简短的awk

awk 'NR%4==1 {printf "\""} {ORS=NR%4?" ":"\""RS} 1' file
"My Name is Michael"
"I'm 25 Years Old"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 2021-03-12
    • 2013-01-23
    • 2012-08-12
    • 2020-01-07
    相关资源
    最近更新 更多