Shell 在linux中将空间分隔文件转换为csv格式
我有一个包含以下格式数据的文件Shell 在linux中将空间分隔文件转换为csv格式,shell,csv,awk,Shell,Csv,Awk,我有一个包含以下格式数据的文件 2 Mar 1 1234 141.98.80.59 1 Mar 1 1234 171.239.249.233 5 Mar 1 admin 116.110.119.156 4 Mar 1 admin1 177.154.8.15
2 Mar 1 1234 141.98.80.59
1 Mar 1 1234 171.239.249.233
5 Mar 1 admin 116.110.119.156
4 Mar 1 admin1 177.154.8.15
2 Mar 1 admin 141.98.80.63
2 Mar 1 Admin 141.98.80.63
我尝试将此命令转换为csv格式,但它在前面提供了额外的(,)输出
cat data.sql | tr-s'[:blank:''''>data1.csv
,2,Mar,1,1234,141.98.80.59
,1,Mar,1,1234,171.239.249.233
,5,Mar,1,admin,116.110.119.156
,4,Mar,1,admin1,177.154.8.15
,2,Mar,1,admin,141.98.80.63
,2,Mar,1,Admin,141.98.80.63
在我的文件中,每个记录前面都有6个字符的空格
如何从前面删除多余的逗号当前方法的改进版本是:
cat data.sql | sed -E -e 's/^[[:blank:]]+//g' -e 's/[[:blank:]]+/,/g' > data1.csv
但请注意,替换空格/逗号并不是将此格式更改为CSV的真正方法。如果实际数据中存在任何逗号和/或空格,此方法将失败
您的示例源文件具有.sql
扩展名这一事实表明,您可能是通过导出数据库获得此文件的,并且已经用其他tr
语句剥离了部分文件?如果是这样,更好的方法是直接导出到CSV(或其他格式)
编辑:按照per Quasimodo在评论中的建议,使
sed
语句更易于移植。当前方法的改进版本是:
cat data.sql | sed -E -e 's/^[[:blank:]]+//g' -e 's/[[:blank:]]+/,/g' > data1.csv
但请注意,替换空格/逗号并不是将此格式更改为CSV的真正方法。如果实际数据中存在任何逗号和/或空格,此方法将失败
您的示例源文件具有.sql
扩展名这一事实表明,您可能是通过导出数据库获得此文件的,并且已经用其他tr
语句剥离了部分文件?如果是这样,更好的方法是直接导出到CSV(或其他格式)
编辑:按照per Quasimodo在评论中的建议,使sed
语句更易于移植。如何使用awk从前面删除额外的逗号:
$ awk -v OFS=, '{$1=$1}1' file
输出:
2,Mar,1,1234,141.98.80.59
1,Mar,1,1234,171.239.249.233
5,Mar,1,admin,116.110.119.156
...
注释中建议的版本的输出:
2,Mar,1,1234,141.98.80.59
1,Mar,1,1234,171.239.249.233
5,Mar,1,admin,116.110.119.156
...
如何使用awk从前面删除额外的逗号:
$ awk -v OFS=, '{$1=$1}1' file
输出:
2,Mar,1,1234,141.98.80.59
1,Mar,1,1234,171.239.249.233
5,Mar,1,admin,116.110.119.156
...
注释中建议的版本的输出:
2,Mar,1,1234,141.98.80.59
1,Mar,1,1234,171.239.249.233
5,Mar,1,admin,116.110.119.156
...
使用是
输出将是
2,Mar,1,1234,141.98.80.59
1,Mar,1,1234,171.239.249.233
5,Mar,1,admin,116.110.119.156
4,Mar,1,admin1,177.154.8.15
2,Mar,1,admin,141.98.80.63
2,Mar,1,Admin,141.98.80.63
使用是
输出将是
2,Mar,1,1234,141.98.80.59
1,Mar,1,1234,171.239.249.233
5,Mar,1,admin,116.110.119.156
4,Mar,1,admin1,177.154.8.15
2,Mar,1,admin,141.98.80.63
2,Mar,1,Admin,141.98.80.63
你想保留前导空格吗?你能显示你的预期输出吗?你想保留前导空格吗?你能显示你的预期输出吗?或者
awk-vofs=',“{$1=”“$1}1”文件
,如果OP确实希望每行有6个前导空格。或者awk-vofs=',“{$1=”“$1}”1'文件
如果OP确实希望每行有6个前导空白字符。