csv 在bash中将回车(^M,以CTRL+V类型出现)替换为sed

cidc1ykv  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(114)

我试图管理一个文件. xlsx在bash与CSV格式。
我确实将excell文件(. xlsx)转换为. csv(CSV UTF-8(逗号分隔)),以开始管理列。
但是,我注意到在excell文件(. xlsx)中,信息包含在列换行符(\n)的单元格中。
你能帮助解决这个问题吗?
The way it look at vim the converted file from xlsx to csv
The information it's not shown properly due to a problems in the segmentation of columns
在图像之前,我应用的命令是:cat file| awk-F '|''{print $2 "|“七块钱。”|“二十七块。”|“二十九块。”|“三十块。”|"$31}"

  • 我确实想到了一个解决方案,通过使用以下命令来使用sed来消除\n:sed ':a; N;$! ba; s/\n//g'文件How can I replace each newline (\n) with a space using sed?然后我可以替换回车符(^M)(例如,|sed-e 's/^M/\n/g')来使用awk正确管理每一列(例如输入|awk-F '|''{print $2 "|“七块钱。”|“二十七块。”|“二十九块。”|“三十块。”|"$31}")

然而,我认为解决方案不起作用,因为通过应用第一个sed命令,所有信息都停留在同一行中,然后我无法使用awk命令管理它。
你想到别的解决办法了吗?
The csv file after applying sed ':a;N;$!ba;s/\n/ /g'
我的期望值为The info of each line be with \n to be able to manage with awk each columnThe result I expect is as shown here by applying the awk command

erhoui1w

erhoui1w1#

从XLS导出CSV通常在字段中单独使用LF,在记录末尾使用CR-LF,即它看起来像:

$ cat -A file
"this","foo$
""bar,bar""$
here","that"^M$
"stuff","nonsense$
here","too"^M$

字符串
实际上只有2条记录,但有些字段包含LF(上面的$)。CR显示为上面的^M
考虑到这种输入格式,要将行末尾的CR-LF转换为LF,并将引用字段中的任何LF转换为空白(只是删除它们会破坏剩余的文本),这将使用任何awk:

$ awk '
    BEGIN { FS=OFS="\"" }
    {
        $0 = prev sep $0
        prev = $0
        sep = ORS
    }
    NF%2 {
        sub(/\r$/,"")
        for ( i=2; i<NF; i+=2 ) {
            gsub(/\n/," ",$i)
        }
        print
        prev = sep = ""
    }
' file
"this","foo ""bar,bar"" here","that"
"stuff","nonsense here","too"


请注意,尽管输入在每条记录的末尾都包含CR-LF,但我们不能依赖awk,因为底层平台的C原语可能会在awk看到它们之前剥离这些CR。在GNU awk中,您可以通过设置BINMODE=3来解决这个问题,但这不能移植到其他awk。
有关使用awk解析CSV的更多信息,请参见What's the most robust way to efficiently parse CSV using awk?

相关问题