如何使用栏定界制表符而不是空格?


58

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

我试图使用以下方式将制表符指定为定界符:

cat myfile | column -t -s"\t"

Answers:


81
column -t -s '\t'

将在\t字符上分隔列。

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

在这里,您要将真实的TAB字符传递给列。使用ksh93,zsh,bash,mksh,busybox sh或FreeBSD sh:

column -ts $'\t'

或通过Ctrl-V Tab在shell提示符下键入来输入真实的制表符(用引号引起来或加反斜杠,因为制表符在外壳程序语法中就像空间一样是令牌分隔符),或使用"$(printf '\t')"(禁用双引号和glob所需的双引号)运算符,因为制表符也是默认值$IFS)。


3
我不得不这样做,column -t -s $'\t'因为bash似乎认为和都'\t'意味着,但意味着字面量标签。Bash发臭\ t$'\t'
ThorSummoner

如果您需要POSIX合规性(请上帝帮我),请查看我的答案,该答案很大程度上基于此出色的答案!
尼克·布尔

这个解决方案对我$'\t'有用-makes选项卡是定界符。但是我很确定我确实awk -F "\t"使用制表符作为awk的分隔符。为什么这行得通,而不是在专栏里?
迈克(Mike)

3

我使用了以下命令(仅在您的文本不包含的情况下有效|):

cat myfile | tr '\t' '|' | column -t -s '|'

这只是将选项卡替换为管道,然后将带有管道的列用作分隔符。

(我之所以这样做,是因为我看不到Stéphane的答案在鱼壳中开箱即用。否则,Stéphane的答案似乎不错。)


3

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

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

column -t -s "$(printf '\t')"

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

column -t -s "$(printf '\011')"

但是,请参阅下面的StéphaneChazelas的评论,以了解为什么在各个Shell版本之间可能不一致。


2
请注意,POSIX没有指定TAB的编码。仍然有一些POSIX系统,其C语言环境编码基于EBCDIC,其中TAB为5,而不是ASCII中的9。只要有可能,最好按名称引用字符,以避免此类问题,"$(printf '\t')"如我的答案所示。请注意,$'...'计划将其包含在POSIX规范的下一个主要版本中。
斯特凡Chazelas

@StéphaneChazelas是$(printf '\t')POSIX吗?谢谢!
尼克·布尔


@StéphaneChazelas非常感谢,我已经更新了答案,包括您非常有用的提示:)
Nick Bull

2

-t是选择要列数。保留此空白不会更改任何内容。另外,您需要在空格后添加空格,-s因此请尝试以下操作:

cat myfile | column -s \t


谢谢。这接近我要寻找的东西。但是,现在所有行都合并为一行。如何将每条线保持在自己的行上?
乌龟

默认情况下,column在行之前填充行。您可能感兴趣pr
潜伏者2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.