使用awk合并行并写入csv文件

Using awk to combine lines and write csv file

如果我有一个看起来像

的文件
Title: Title1
Author: Author1
Body: Body1.1
      Body1.2
      Body1.3

Title: Title2
Author: Author2
Body: Body2.1
      Body2.2
      Body2.3

等等。

我要输出

"Title1", "Author1", 
"Body1.1
 Body1.2
 Body1.3"

"Title2", "Author2",
"Body2.1
 Body2.2
 Body2.3" 

作为 csv 文件。我应该怎么做?

另外请注意,有时作者的姓名可能包含“,”,因此我们要确保一切都是字符串格式

我现在正尝试使用 awk 通过 while 循环为我完成这项工作,但我相信应该有更简单的方法来完成这项工作。

您可以使用这个 awk 命令:

awk -F' *: *' '=="Title"{t=;if (b) print b;b="";next}
  =="Author"{printf "\"%s\", \"%s\"\n", t, ;next}
  NF==1||=="Body"{sub(/^ +/, "", ); b=(!b)? : b ORS ;next}
  END{print b}' file
"Title1", "Author1"
Body1.1
Body1.2
Body1.3
"Title2", "Author2"
Body2.1
Body2.2
Body2.3

这会产生您想要的输出。希望评论能说明发生了什么。

$ cat script.awk    
BEGIN { FS="[:[:space:]]+" } # set field separator to one or more colons or space chars
/Title/ { t= } # save title
/Author/{ printf "\"%s\", \"%s\",\n", t,  } # print title and author
/Body:/{ f=1; printf "\"%s", ; next } # set f to true and print 1st body
!NF{ f=0; print "\"\n" } # empty line, set f to false
f{ printf "\n %s",  } # print body
END{ print "\"" } # print final quote
$ awk -f script.awk file
"Title1", "Author1",
"Body1.1
 Body1.2
 Body1.3"

"Title2", "Author2",
"Body2.1
 Body2.2
 Body2.3"

根据输入数据,此 gnu awkgnu 由于 RS)可能有效:

awk -vRS= '{print "\"""\", \"""\",\n\"""\n ""\n ""\"\n"}' t
"Title1", "Author1",
"Body1.1
 Body1.2
 Body1.3"

"Title2", "Author2",
"Body2.1
 Body2.2
 Body2.3"

通过将Record Selector设置为nothing,它会将每个数据块作为一条记录进行线程化,然后我们只需要取我们需要的字段号即可。