如何使用列来分隔制表符而不是空格?

tur*_*tle 84 command-line text-processing quoting columns

我想使用 Unixcolumn命令来格式化一些文本。我有由制表符分隔的字段,但在每个字段中也有空格。column分隔空白(制表符和空格)。如何使列仅使用制表符作为分隔符?

我试图使用以下命令将制表符指定为分隔符:

cat myfile | column -t -s"\t"
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 114

column -t -s '\t'
Run Code Online (Sandbox Code Playgroud)

将分隔列\t字符。

column -s \t与 相同column -s t,因为反斜杠被 shell 解释为引用运算符。

在这里,您想将一个真正的 TAB 字符传递给列。使用 ksh93、zsh、bash、mksh、busybox sh 或 FreeBSD sh:

column -ts $'\t'
Run Code Online (Sandbox Code Playgroud)

或者通过Ctrl-V Tab在 shell 提示符下键入来输入一个真正的制表符(在引号内或前面有一个反斜杠,因为制表符是 shell 语法中的标记分隔符,就像空格一样),或者使用"$(printf '\t')"(禁用 split+glob 所需的那些双引号运算符作为制表符也恰好在 ) 的默认值中$IFS

  • 我不得不做 `column -t -s $'\t'` 因为 bash 似乎认为 `'\t'` 意味着 `\ ` 和 `t`,但 `$'\t'` 意味着一个文字制表符。Bash 很臭 (4认同)

Nic*_*ull 8

对于 POSIX,$'...'未定义,也称为 ANSI-C 转义。

相反,你可以使用$(printf '\t')

column -t -s "$(printf '\t')"
Run Code Online (Sandbox Code Playgroud)

$(printf '\011')可以使用,因为011(十进制 9 的八进制表示)是水平制表符的 ANSI 代码:

column -t -s "$(printf '\011')"
Run Code Online (Sandbox Code Playgroud)

但是,请参阅下面来自 Stéphane Chazelas 的评论,了解为什么这在不同的 shell 版本中可能不一致。

  • [是](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html) (3认同)
  • 请注意,POSIX 没有指定 TAB 的编码是什么。仍然有 POSIX 系统的 C 语言环境编码是基于 EBCDIC 的,其中 TAB 是 5,而不是像 ASCII 中的 9。在可能的情况下,最好按名称引用字符以避免此类问题,如我的回答中所示的 `"$(printf '\t')"`。请注意,`$'...'` 计划包含在 POSIX 规范的下一个主要版本中。 (2认同)

Aar*_*man 6

我使用了以下内容(仅适用于您的文本不包含|):

cat myfile | tr '\t' '|' | column -t -s '|'
Run Code Online (Sandbox Code Playgroud)

这只是用管道替换制表符,然后使用带有管道的列作为分隔符。

(我这样做是因为我在 Stéphane 的答案中没有看到任何在鱼壳中开箱即用的内容。否则,Stéphane 的答案似乎不错。)


lur*_*ker 2

用于-t选择所需的列数。将此留空不会改变任何内容。另外,你想要在之后有空格,-s所以试试这个:

cat myfile | column -s \t