bash - 在终端中格式化输出,删除空行并转换逗号

标签 bash sed terminal formatting tr

我有这样的输出。我需要格式化该输出。

a
b
c

d
e
f
g
h

k
l
m
n

我需要删除空行和结束行。
并像这样格式化输出。

a,b,c
d,e,f,g,h
k,l,m,n

我尝试了不同的 sed 和 tr 命令,但找不到解决方案。

最佳答案

我认为最简单的方法是使用 awk:

awk -v RS= -F '\n' -v OFS=, '{ $1 = $1 } 1' filename

诀窍在于各种特殊变量:

  • RS 表示输入中的记录由空行分隔。
  • -F '\n'FS 设置为 \n,这意味着输入记录中的字段由换行符分隔。<
  • OFS 设置为 , 表示字段在输出中用逗号分隔。
  • ORS 默认为换行符,因此输出中的记录以换行符分隔。

在代码中,$1 = $1 强制 awk 重新组装记录,以便所有这些都得到实际应用。结果是记录被读取为以空行分隔的记录的换行分隔字段,并作为换行分隔记录的逗号分隔字段(即 CSV)打印。

您也可以使用 sed 来完成:

sed ':a /\n$/! { N; $! ba; }; s///; s/\n/,/g' filename

这会读取新行并将它们附加到模式空间,直到找到空行或文件末尾,然后删除末尾的额外换行符(如果存在,则不会在末尾)文件的)并用逗号替换剩余的换行符。请注意,我不建议这样做,因为 awk 在概念上更适合。毕竟,输入数据是表格形式的,并且 awk 擅长处理此类数据。

关于bash - 在终端中格式化输出,删除空行并转换逗号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31193372/

相关文章:

android - sed AndroidManifest 版本

terminal - Kotlin-native 执行命令并获取输出

windows - 如何配置 Windows 终端以启动 Cygwin (mintty) bash?

bash - 如何在 bash 中使用不可打印的字符作为排序命令的字段分隔符?

perl - 我如何在 Perl 5.8.8 中使用 'say'?

bash - 使用了过多的处理能力,这部分效率低下吗?

macos - 使用 applescript 和最佳实践根据内容选择终端中的特定选项卡

linux - 获取一个文件的所有者,并将其应用于另一个文件

linux - 从 BASHRC 解析函数

regex - 如何使用sed匹配月日年模式?