使用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 awk
(gnu
由于 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,它会将每个数据块作为一条记录进行线程化,然后我们只需要取我们需要的字段号即可。
如果我有一个看起来像
的文件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 awk
(gnu
由于 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,它会将每个数据块作为一条记录进行线程化,然后我们只需要取我们需要的字段号即可。