如何在每列后面添加逗号?

如何在每列后面添加逗号?

我需要这样做,以便当我在 Excel 中打开 .csv 时,每一列都有自己的选项卡。

我的文字如下所示:

smmsp              Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT                            n    Account expires : never
samba              Purpose - Service account for Samba; Owner - sysadmin; SERVICE ACCOUNT                               n    Account expires : never
puppet             Purpose - Service account for Puppet; Owner - sysadmin; SERVICE ACCOUNT                              n    Account expires : never

我需要这样的:

smmsp,              Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT,                            n,    Account expires : never,
samba,              Purpose - Service account for Samba; Owner - sysadmin; SERVICE ACCOUNT,                               n,    Account expires : never,
puppet,             Purpose - Service account for Puppet; Owner - sysadmin; SERVICE ACCOUNT,                              n,    Account expires : never,

我尝试通过管道将输出连接到awk 'gsub(" ", ",", $1)' FS=, OFS=,但它用逗号替换了每个空格

答案1

输入文件似乎是固定宽度格式。您应该能够在 Excel 中打开它并指定每列的位置而不进行任何修改。

但是,由于输入示例中的所有字段似乎都包含至少 2 个或更多空格的填充,因此您可以用逗号替换所有出现的 2 个或更多空格:

sed -r 's/  \+/,/g' input.txt

注意事项:

  • 上面需要扩展正则表达式(-r),在 GNU 的 sed 中可用
  • 如果任何文本字段的长度足以填充固定宽度字段,或者仅留一个空格,则将无法插入逗号。

这是另一种方法,将逗号放在固定宽度字段的末尾,然后删除多余的空格。本示例中固定宽度字段的宽度基于您的输入示例:

sed 's/\(.\{19\}\)\(.\{101\}\)\(.\{5\}\)/\1,\2,\3,/' columns.txt | sed 's/ *,/,/g'

后一种方法不需要扩展正则表达式,并且即使条目填充整个固定宽度字段也应该起作用。

答案2

因为你似乎想保留内部间距,所以我会做类似于@cherdt的解决方案,但你可以捕获像

sed -e 's/\(  \+\)/,\1/g' input

这将在每个 2 个或更多空格的块之前放置一个逗号,而不改变空格的数量。

答案3

如果列由制表符分隔(看起来像这样),那么这应该有效:

$awk -F "[\t]*" '{print $1", "$2", "$3", "$4", "}' b.txt
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never, 

如果列不是用制表符而是用空格分隔的,那么使用空格作为分隔符会有点混乱,因为即使在数据之间也存在空格。

我会读取该文件并将其存储在一个数组中,如下所示:

$while IFS=" " read -a line;do for i in {0,11,12,16};do line[$i]+=",";done;echo "${line[@]}";done <b.txt
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,

我注意到,在空格分隔方面,我需要在数组元素 line[0]、line[11]、line[12] 和 line[16] 中添加逗号。

这个技巧要求所有行都具有相同的格式。
如果不是,您需要读取每个数组元素并在您想要的位置插入逗号。

如果你有很多行并且你关心性能,你可以构建一个 awk 脚本来以类似的方式处理所有变量(从 $1 到 $NF),但在 awk 脚本内部(我不擅长 awk.. )

相关内容