bash - 根据分隔符拆分文件,然后加入单独的行

标签 bash awk sed

我有一个文件,example.txt

0
   A
   B
   C, C, C
   D, D
   E
   F
1
   A, A, A
   B
   C
2
   A
   B
   C
   D, D, D
   E

我需要根据任意数字分隔文件,然后获取这些数字之间的内容并将它们连接成一行,对文件的每个部分重复该过程:

A, B, C, C, C, D, D, E, F
A, A, A, B, C
A, B, C, D, D, D, E

我想到的最好的是:

cat example.txt | sed -e '1,/^[0-9]/d' -e '/^[0-9]/,$d' | paste -sd "," -

A, A, A,   B,   C

在这种情况下,这只是中间部分。那,或者将所有部分打印到一行。

最佳答案

更短的惯用 awk 替代方案:

$ awk '$1=$1{printf "%s%s",$0,(RT==","?OFS:ORS)}' RS="[0-9]|," OFS=", " file1
A, B, C, C, C, D, D, E, F
A, A, A, B, C
A, B, C, D, D, D, E

RS 是记录分隔符。默认为换行,这里设置为数字或逗号
OFS 是输出字段分隔符 = 带单个空格的逗号
RT 是使用中的记录分隔符值
ORS 是输出记录分隔符,默认换行
$1=$1 是一个惯用赋值,它强制 awk 根据 OFS、ORS 等的值重新计算字段和记录
(RT==","?OFS:ORS)是一个基于synthax的三元if操作
(条件?真 Action :假 Action )

关于bash - 根据分隔符拆分文件,然后加入单独的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48292621/

相关文章:

python - 用于在文件夹中查找文件的 Bash 脚本

java - 与 Bash 相比,Java 中的语言环境区分大小写不一致

linux - awk 在 linux 中子集化失败

awk "if"语句

linux - BASH:grep/awk/sed 提取变量数据

regex - 非贪婪模式表达式

bash - 使用逗号分隔的 sed awk 连接两个文件

bash - 修改文件中一行的一部分

linux - 当位置存储在变量中时,为什么 bash 找不到文件?

unicode - 我如何摆脱这个 unicode 字符?