将多行连接成一行,直到找到模式

将多行连接成一行,直到找到模式

使用 AWK 和 SED 模式,我最终得到一个类似于以下内容的文件

|
9000
3000
1000
0000
0000
2000年
1000
2000年
|
5669000
518000
3000
16000
0000
28000
2241000
2841000
|
9020000
453000
520000
4000
2852000
5191000
75000
|

是否可以连接“|”之间分隔的行成一行用逗号分隔?

9000,3000,1000,0000,0000,2000,1000,2000
5669000,518000,3000,16000,0000,28000,2241000,2841000
9020000,453000,520000,4000,2852000,5191000,75000

我使用粘贴来执行此操作,但它会产生不需要的结果,因为“|”之间的行数不相等。

答案1

awk解决方案。怀疑有点啰嗦。

$ awk 'BEGIN{RS="|"}NF>1{print substr(gensub(/\n/,",","g"),2,length($0)-2)}' file
9000,3000,1000,0000,0000,2000,1000,2000
5669000,518000,3000,16000,0000,28000,2241000,2841000
9020000,453000,520000,4000,2852000,5191000,75000
$

在线尝试一下!

答案2

这似乎工作得很好:

$ tr "|\n" "\n," < input | sed 's/^,//;s/,$//'
9000,3000,1000,0000,0000,2000,1000,2000
5669000,518000,3000,16000,0000,28000,2241000,2841000
9020000,453000,520000,4000,2852000,5191000,75000

我们用来tr|s 翻译成换行符,并将换行符翻译成,s。然后我们获取结果输出并用 剥离和前导或尾随,s sed

答案3

sed ':L; ${s/\n/,/g; s/,|,/\n/g; s/|,\|,|//g};  N; bL;' file

答案4

awk -vRS='|' -vOFS=, '$1=$1""' infile
  • ,更改RS='|'awk 的默认值埃科德Seerator 将其\n改为管道|
  • ,更改OFS=,awk 的默认值输出F产量Seerator 是用空格代替逗号,

  • (您$1==$1可以使用任何字段) 导致重新评估$0(awk 中已知的整行) 并将基于 RS as|和 OFS as连接字段,

  • 双引号 in'$1=$1""'用于强制 awk 进行字符串赋值,因此只有零的行不会被删除。

  • 输出是:

    9000,3000,1000,0000,0000,2000,1000,2000
    5669000,518000,3000,16000,0000,28000,2241000,2841000
    9020000,453000,520000,4000,2852000,5191000,75000
    

相关内容