我最近跑步进入以下建议的解决方案:
cat results.csv | tr $'\x01' \\t > result.csv
将格式错误的 csv 文件(使用\x01
unicode 作为分隔符的文件)转换为正确的文件。
$'\x01' 到底告诉 bash 做什么?该命令在 Zsh 中似乎不能很好地工作。
如果重要的话,实际目标是转换如下内容:
b'flight_uid\thaving_price\tbid_price\timpressions_source_timestamp\n'b'0FY6ZsrnMy\x012000\x012270.0\x011427243278000\n0FamrXG9AW\x01710\x01747.0\x011427243733000\n 0FY6ZsrnMy\x012000\x012270.0\x011427245266000\n0FY6ZsrnMy\x012000\x012270。 0\x011427245088000\n0FamrXG9AW\x01330\x01747.0\x011427243407000\n0FamrXG9AW\x01710\x01747.0\x011427243981000\n0FamrXG9AW\x014 90\x01747.0\x011427245289000\n0FamrXG9AW\x01735\x01747.0\x011427244634000\n0FamrXG9AW\x01420\x01747。 0\x011427245595000\n0FamrXG9AW\x01470\x01747.0\x011427242443000\n0FK9yvBt9B\x011050\x011295.0\x011427242253000\n0FK9yvBt9B \x011050\x0112%
转换为常规制表符分隔的 csv 文件。
当我使用 Zsh 尝试此操作时,我得到以下结果,这似乎没有改变任何内容:
b'flight_uid\thaving_price\tbid_price\timpressions_source_timestamp\n'b'0FY6ZsrnMy\x012000\x012270.0\x011427243278000\n0FamrXG9AW\x01710\x01747.0\x011427243733000\n 0FY6ZsrnMy\x012000\x012270.0\x011427245266000\n0FY6ZsrnMy\x012000\x012270。 0\x011427245088000\n0FamrXG9AW\x01330\x01747.0\x011427243407000\n0FamrXG9AW\x01710\x01747.0\x011427243981000\n0FamrXG9AW\x014 90\x01747.0\x011427245289000\n0FamrXG9AW\x01735\x01747.0\x011427244634000\n0FamrXG9AW\x01420\x01747。 0\x011427245595000\n0FamrXG9AW\x01470\x01747.0\x011427242443000\n0FK9yvBt9B\x011050\x011295.0\x011427242253000\n0FK9yvBt9B \x011050\x0112%
答案1
来自 bash 文档:
Words of the form $'string' are treated specially. The word expands to
string, with backslash-escaped characters replaced as specified by the
ANSI C standard. Backslash escape sequences, if present, are decoded
as follows:
\a alert (bell)
(...)
\nnn the eight-bit character whose value is the octal value
nnn (one to three digits)
\xHH the eight-bit character whose value is the hexadecimal
value HH (one or two hex digits)
因此,在您发布的示例中,$'\x01'
根据您的描述,只是代码为 1 的字符。从我的(非常有限的)测试来看,zsh 似乎也支持这一点:
$ printf %s $'\x01' | od -t x1
0000000 01
0000001
但是,tr
只有当我们假设您的文件实际上包含代码为 1 的文字字符时,您发布的命令才能解决您的问题;从注释中可以看出,您所拥有的是\x01
制表符应该在的四个字符的字符串。以下过滤器应解决此问题:
sed 's/\\x01/\t/g'