该命令cut
有一个选项-c
可以处理字符,而不是带有选项的字节-b
。但这似乎不起作用,在en_US.UTF-8
语言环境中:
第二个字节给出了第二个 ASCII 字符(在 UTF-8 中编码完全相同):
$ printf 'ABC' | cut -b 2
B
Run Code Online (Sandbox Code Playgroud)
但不会在 UTF-8 语言环境中给出三个希腊非 ASCII 字符中的第二个:
$ printf '???' | cut -b 2
?
Run Code Online (Sandbox Code Playgroud)
没关系 - 这是第二个字节。
所以我们看第二个字符:
$ printf '???' | cut -c 2
?
Run Code Online (Sandbox Code Playgroud)
那看起来坏了。
通过一些实验,结果表明范围3-4
显示了第二个字符:
$ printf '???' | cut -c 3-4
?
Run Code Online (Sandbox Code Playgroud)
但这与字节 3 到 4 相同:
$ printf '???' | cut -b 3-4
?
Run Code Online (Sandbox Code Playgroud)
所以-c
不超过-b …
我有(有时)制表符分隔数据的多行文本文件。我想输出文件以便我可以浏览它 - 所以我只想看到每行的前 80 个字符(我设计的文本文件将重要的内容放在每一行的前面)。
我以为我可以使用 cat 读取文件的每一行,并将每一行发送到管道中的下一个命令:
cat tabfile | cut -c -80
Run Code Online (Sandbox Code Playgroud)
但这似乎坏了。我试着四处游荡,grep 似乎工作 - 但后来我发现,不,它没有(不是文件中的每一行都有 80 多个字符) - 似乎制表符被视为单个字符。
我试过:
cat tabfile | tr \t \040 | cut -c -80
Run Code Online (Sandbox Code Playgroud)
尽管这会通过消除空白可读性来稍微破坏我的数据。但这没有用。也没有:
cat tabfile | tr \011 \040 | cut -c -80
Run Code Online (Sandbox Code Playgroud)
也许我使用 tr 错了?我之前遇到过 tr 问题,想删除多个空格(似乎我在这台机器上可以访问的 tr 版本有一个 -s 选项来压缩多个字符 - 我可能需要更多地使用它)
我敢肯定,如果我搞砸了,我可以使用 perl、awk 或 sed 或其他方法来做到这一点。
但是,我想要一个使用(POSIX?)常规命令的解决方案,以便它尽可能具有可移植性。如果我最终使用 tr,我可能最终会尝试将制表符转换为字符,也许会进行计算,削减计算,然后将这些字符重新转换为制表符以进行输出。
它不需要是一行/直接在命令行上输入 - 脚本就可以了。
有关选项卡文件的更多信息:
我使用制表符来分隔字段,因为有一天我可能想将数据导入其他程序。所以我倾向于在内容之间只有一个标签。但我也使用制表符将内容与垂直列对齐,以在查看纯文本文件时提高可读性。这意味着对于某些文本,我用空格填充内容的末尾,直到我到达选项卡将工作的位置,以将下一个字段与其上方和下方的字段对齐。
DarkTurquoise #00CED1 海洋、天空、划艇自然 MediumSpringGreen #00FA9A 适用于树木魔法 Lime #00FF00 仅用于春鸡和果蔬$