Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 在linux中将空间分隔文件转换为csv格式_Shell_Csv_Awk - Fatal编程技术网

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个前导空白字符。