2

我有一个 CSV 文件,其中每一列在实际值之后都包含不必要的空格(或制表符)。我想创建一个新的 CSV 文件,使用 bash 删除所有空格。

例如

输入 CSV 文件中的一行

abc def pqr             ;valueXYZ              ;value PQR              ;value4

输出 csv 文件中的同一行应该是

abc def pqr;valueXYZ;value PQR;value4

我尝试使用 awk 修剪每一列,但没有奏效。谁能帮我解决这个问题?

提前致谢 :)

我编辑了我的测试用例,因为这里的值可以包含空格。

4

5 回答 5

4
$ cat cvs_file | awk 'BEGIN{ FS=" *;"; OFS=";" } {$1=$1; print $0}'
  1. Set the input field separator (FS) to the regex of zero or more spaces followed by a semicolon.
  2. Set the output field separator (OFS) to a simple semicolon.
  3. $1=$1 is necessary to refresh $0.
  4. Print $0.

$ cat cvs_file
abc def pqr             ;valueXYZ              ;value PQR              ;value4

$ cat cvs_file | awk 'BEGIN{ FS=" *;"; OFS=";" } {$1=$1; print $0}'
abc def pqr;valueXYZ;value PQR;value4
于 2012-06-27T20:28:31.580 回答
2

如果值本身总是没有空格,那么规范的解决方案(在我看来)将是使用tr

$ tr -d '[:blank:]' < CSV_FILE > CSV_FILE_TRIMMED
于 2012-06-27T14:48:55.240 回答
1

这将用一个空格替换多个空格:

sed -r 's/\s+/ /g'
于 2012-06-27T14:51:47.550 回答
0

如果您知道列数据将以什么结尾,那么这是一种万无一失的方法:

sed 's|\(.*[a-zA-Z0-9]\) *|\1|g'

字符类将是您放置数据结尾的地方。

Otherwise, if you know more than one space is not going to come in your fields, then you could use what user1464130 gave you.

If this doesn't solve your problem, then get back to me.

于 2012-06-27T15:12:50.753 回答
0

I found one way to do what I wanted that is remove blank line and remove trailing newline of a file in an efficient way. I do this with :

grep -v -e '^[[:space:]]*$' foo.txt

from Remove blank lines with grep

于 2019-09-06T08:05:57.423 回答