Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
Linux tr-s无法压缩连续的空格_Linux_Bash_Shell_Tr - Fatal编程技术网

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

Linux tr-s无法压缩连续的空格,linux,bash,shell,tr,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

下面是我试图处理的文本文件的一个片段:

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:'',

tr-s'',

但输出总是如下所示:

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
的输出片段:

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.

您的输入被编码为UTF-16(或UCS-2),但您读取它时就像它是ASCII(或UTF-8、ISO-8859或类似),因此您可以看到交替的ASCII和null值

因此,所有空间似乎都由NUL分隔,不会合并

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

iconv-f utf-16-t utf-8\
|tr-s'[:空白:'''\
|iconv-f utf-8-t utf-16
显然,如果希望输出为UTF-8格式,可以跳过最后的重新编码步骤


您无法使
tr
或其他标准实用程序与UTF-16或UCS-2协同工作,因此,如果您不想更改为Perl或Python,这可能是最好的方法。

您的输入被编码为UTF-16(或UCS-2),但您在读取它时就好像它是ASCII(或UTF-8、ISO-8859或类似),所以您可以看到交替的ASCII和null值

因此,所有空间似乎都由NUL分隔,不会合并

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

iconv-f utf-16-t utf-8\
|tr-s'[:空白:'''\
|iconv-f utf-8-t utf-16
显然,如果希望输出为UTF-8格式,可以跳过最后的重新编码步骤


您无法使
tr
或其他标准实用程序与UTF-16或UCS-2一起在本机工作,因此,如果您不想更改为Perl或Python,这可能是最好的方法。

由于文件中充满了空字符,您可以在使用tr处理之前删除它们(假设您不需要任何空字符)

与tr合作两次

tr -d '\0' < file | tr -s '[:blank:]' ','
或者如果你想保留你的编码

perl -pe 's/([[:blank:]]\x00)+/,\x00/g' file
或者可能是最可靠的,您可以将perl的编码设置为读取

perl -Mopen=":std,:encoding(utf-16le)" -pe 's/[[:blank:]]+/,/g' test

由于文件中充满了空字符,您可以在使用tr处理之前删除它们(假设您不希望其中包含任何空字符)

与tr合作两次

tr -d '\0' < file | tr -s '[:blank:]' ','
或者如果你想保留你的编码

perl -pe 's/([[:blank:]]\x00)+/,\x00/g' file
或者可能是最可靠的,您可以将perl的编码设置为读取

perl -Mopen=":std,:encoding(utf-16le)" -pe 's/[[:blank:]]+/,/g' test


@尤金尼什<代码>-s
是压缩重复。是的,文件有问题,适合我。也可以考虑使用<代码> [B:::/COD],而不是<代码> [S:::[COD:>代码]来保存新行(假设您想)@ PyrSybBar可以运行<代码> XXD>文件< /代码>并将输出输出到您的问题中吗?@ 123更新帖子,输出“代码> XXD < /COD> >,看来您正在读取UTF 16,就好像它是ASCII一样,UTF-8或ISO-8859。@EugeneSh<代码>-s是压缩重复。是的,文件有问题,适合我。也可以考虑使用<代码> [B:::/COD],而不是<代码> [S:::[COD:>代码]来保存新行(假设您想)@ PyrSybBar可以运行<代码> XXD>文件< /代码>并将输出输出到您的问题中吗?@ 123更新帖子,输出“代码> XXD < /COD> >,看来您正在读取UTF 16,就好像它是ASCII一样,UTF-8或ISO-8859.UTF-16语言环境不适用于Linux,因为编码字符串与C不兼容;你打字的时候我发现了!我将对其进行编辑以合并information@TobySpeight如果我运行这个命令,它会在文件的开头插入
fffe
?是@123(因为我们没有权限显示hextump的开头,我们无法判断它是否以字节顺序标记开始)。您可以对没有BOM的流使用
utf-16be
utf-16le
(视情况而定)。@TobySpeight只是觉得很奇怪,当它接受没有BOM的输入时,会插入它。不要经常使用iconv,有没有办法指定endianness?Linux不存在UTF-16语言环境,因为编码字符串与C不兼容。谢谢,@thatotherguy;你打字的时候我发现了!我将对其进行编辑以合并information@TobySpeight如果我运行这个命令,它会在文件的开头插入
fffe
?是@123(因为我们没有权限显示hextump的开头,我们无法判断它是否以字节顺序标记开始)。您可以对没有BOM的流使用
utf-16be
utf-16le
(视情况而定)。@TobySpeight只是觉得很奇怪,当它接受没有BOM的输入时,会插入它。不要经常使用iconv,有没有办法指定endianness?托比的回答也是一个很好的方法。但这一个直接解决了问题,对我的案例有效。谢谢。我本来打算建议使用Perl方法(使用
:encoding
),但后来被拖到了现实生活中,所以谢谢你把它包括进来。Toby的回答也是一个很好的方法。但这一个直接解决了问题,对我的案例有效。谢谢。我本来打算建议使用Perl方法(使用
:encoding
),但后来被拖到了现实生活中,所以谢谢你把它包括进来。