tr -s无法压缩连续的空格

时间:2017-06-21 17:10:34

标签: linux bash shell tr

以下是我试图操作的文本文件的片段:

845136006577              1.0
845136006638              4.0
845136006676              6.0
845136007895              3.0
845136007970              7.0
845136008052              9.0
845136008175              4.0
845136008298              4.0
845136008373              4.0
845136008410              4.0
845136008557              3.0
845136008595              4.0

我正在尝试将每行上的所有空格压缩为单个,(逗号)。

以下是我的尝试:

tr -s '[:space:]' ',' < file.txt

tr -s ' ' ',' < file.txt

但输出总是如下:

845136006577,,,,,,,,,,,,,,1.0,
845136006638,,,,,,,,,,,,,,4.0,
845136006676,,,,,,,,,,,,,,6.0,
845136007895,,,,,,,,,,,,,,3.0,
845136007970,,,,,,,,,,,,,,7.0,
845136008052,,,,,,,,,,,,,,9.0,
845136008175,,,,,,,,,,,,,,4.0,
845136008298,,,,,,,,,,,,,,4.0,
845136008373,,,,,,,,,,,,,,4.0,

我的文件存在潜在的编码问题吗?有些事情不对。

更新

xxd < file.txt的输出片段:

00003b0: 3600 3000 3000 3800 3500 3500 3700 2000  6.0.0.8.5.5.7. .
00003c0: 2000 2000 2000 2000 2000 2000 2000 2000   . . . . . . . .
00003d0: 2000 2000 2000 2000 2000 3300 2e00 3000   . . . . .3...0.
00003e0: 2000 0a00 3800 3400 3500 3100 3300 3600   ...8.4.5.1.3.6.
00003f0: 3000 3000 3800 3500 3900 3500 2000 2000  0.0.8.5.9.5. . .
0000400: 2000 2000 2000 2000 2000 2000 2000 2000   . . . . . . . .
0000410: 2000 2000 2000 2000 3400 2e00 3000 2000   . . . .4...0. .
0000420: 0a00 3800 3400 3500 3100 3300 3600 3000  ..8.4.5.1.3.6.0.
0000430: 3000 3800 3600 3900 3400 2000 2000 2000  0.8.6.9.4. . . .
0000440: 2000 2000 2000 2000 2000 2000 2000 2000   . . . . . . . .
0000450: 2000 2000 2000 3500 2e00 3000 2000 0a00   . . .5...0. ...
0000460: 3800 3400 3500 3100 3300 3600 3000 3000  8.4.5.1.3.6.0.0.

2 个答案:

答案 0 :(得分:5)

由于文件中充满了空字符,因此您可以在使用tr进行处理之前将其删除(假设您不需要任何空字符)。

使用tr两次

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

使用单个perl

otherFunction <- function(df, ...){
  ...
}

myFunction <- function(df){
  result <- tryCatch({ 
    otherFunction(df, ...)
  }, error = function(e) {
    NA                             # the result is always being set to NA
  })
  return result
}
...
myDf <- ... 
myFunction(myDf)

error: "could not find function "otherFunction""

或者如果您想保留编码

tr -d '\0' < file | tr -s '[:blank:]' ','

或者可能最强大,您可以设置perl的编码来读取。

perl -pe 's/\x00//g;s/[[:blank:]]+/,/' file

答案 1 :(得分:2)

您的输入被编码为UTF-16(或UCS-2),但您正在将其读取为ASCII(或UTF-8,ISO-8859或类似),因此您会看到备用ASCII和空值。

所以这些空间似乎都被NUL分开,并且不会被合并。

一种解决方法是通过iconv并返回(假设您希望结果采用相同的编码):

iconv -f utf-16 -t utf-8 \
    | tr -s '[:blank:]' ',' \
    | iconv -f utf-8 -t utf-16

显然,如果您希望输出为UTF-8,则可以跳过最后的重新编码步骤。

您无法使tr或其他标准实用程序与UTF-16或UCS-2本机一起使用,因此如果您不想更改为Perl或蟒。