使用 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