shell - 从unix中的内部列中删除csv文件中的新行字符

标签 shell csv unix awk newline

示例输入数据::

cat test.csv
234,aa,bb,cc,30,dd

22,cc,

ff,dd,

40,gg

pxy,aa,,cc,

40

,dd

所需输出::

cat test_new.csv
234,aa,bb,cc,30,dd

22,cc,ff,dd,40,gg

pxy,aa,,cc,40,dd

我尝试了各种 awksed 命令,但似乎没有任何效果。

例如::awk 'NR == 1{ printf $0;下一个 } { printf "%s%s", (/^[0-9]+,/? ORS : ""), $0 } END{ print ""}'

上面的 awk 仅查找带有“,”的数字字符,但是如果数字出现在带有换行符的列中,这将创建额外的行。

输入文件包含 Control M 字符,我已经使用 dos2unix 删除了

最佳答案

关于“输入文件包含 Control M 字符,我已经使用 dos2unix 删除了” - 这可能会让您的生活变得更加困难。行中的“换行符”很可能只是 LF,而记录结尾是 CRLF,因此通过删除 CR我们不能再简单地将 awk RS 设置为 CRLF,然后删除记录中剩余的任何 LF

如果您的文件是从 Excel 导出的,正如您在问题下的注释中所说,那么无论字段是否带引号,它都会在每条记录的末尾使用 CRLF ,并且 LF 在每个字段中单独存在,如果您不运行 dos2unix ,它看起来像这样:

$ cat -v test.csv
234,aa,bb,cc,30,dd^M
22,cc,
ff,dd,
40,gg^M
pxy,aa,,cc,
40
,dd^M

然后使用任何 awk:

$ awk -v ORS= '{sub(/\r$/,"\n")} 1' test.csv
234,aa,bb,cc,30,dd
22,cc,ff,dd,40,gg
pxy,aa,,cc,40,dd

或者,如果您愿意,可以使用 GNU awk 进行多字符 RS:

$ awk -v RS='\r\n' '{gsub(/\n/,"")} 1' test.csv
234,aa,bb,cc,30,dd
22,cc,ff,dd,40,gg
pxy,aa,,cc,40,dd

有关使用 awk 解析 CSV 的更多信息,请参阅 What's the most robust way to efficiently parse CSV using awk? .

关于您的原始脚本 - 切勿使用 printf $0,始终使用 printf "%s", $0 代替,因为前者在 $0 时会失败> 包含任何 printf 格式化字符,例如 %s:

$ echo 'a%sb' | awk '{printf "%s", $0}'
a%sb$

$ echo 'a%sb' | awk '{printf $0}'
awk: cmd. line:1: (FILENAME=- FNR=1) fatal: not enough arguments to satisfy format string
        `a%sb'
          ^ ran out for this one
$

这适用于对所有输入数据使用 printf

关于shell - 从unix中的内部列中删除csv文件中的新行字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68919927/

相关文章:

Unix 粘贴命令覆盖数据

php - 如果命令在 mac 终端内运行,如何让 shell_exec 表现得像命令一样?

linux - shell脚本中&和()的使用

java - 将 CSV 数据源从 java 程序传递到报告表

linux - 用于以用户身份登录并执行另一个脚本的脚本

linux - : `ls -lt | grep - | head -1 | awk ' {print $9 }' | xargs rm` 是什么意思

python - 从 bash 导出变量并在 Python 中使用它

regex - 多行正则表达式如何在 bash 中替换并存储在变量中?

javascript - 如何在 nodejs json2csv 中的现有 csv 文件中追加新行?

python - 从 pandas 中修改后的 csv 加载数据集