我需要这样做,以便当我在 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.. )