Linux shell输出制表符,关于bash:如何在终端中打印制表符分隔文件

这篇博客讨论了在Mac上处理制表符分隔的txt文件时遇到的行尾问题,即旧的Mac风格行尾导致在终端中打印时出现混乱。作者提供了多种解决方案,包括使用`tr`、`awk`和`sed`命令来替换回车符为Unix换行符,并添加缺失的结束换行符。此外,还提到了`grep`和可能存在的`mac2unix`工具作为替代方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我将excel数据导出到制表符分隔的txt文件中,但是我很难在终端中打印它,这是文件:

heading1    heading2    heading3    heading4    heading5    heading6    heading7

col1row1    col2row1    col3row1    col4row1    col5row1    col6row1    col7row1

col1row2    col2row2    col3row2    col4row2    col5row2    col6row2    col7row2

col1row3    col2row3    col3row3    col4row3    col5row3    col6row3

col1row4    col2row4    col3row4    col4row4

您可以在此处下载文本文件。

我尝试了sed和awk。

update1:我在bsd(mac)上,cat file.txt以不可读的丑陋格式打印,我有一个bash脚本需要输入标签,因此我只先打印标签,然后从打印列表中选择正确的标签

我不明白。 你不能做cat file.txt?

您到底尝试了什么,期望得到什么输出?

在终端中打印它是什么意思。 猫文件够吗?

请看我的更新

您的文件有两个问题:

它具有旧的Mac风格的行尾。这些导致Unix终端上的输出以一种令人困惑的方式被覆盖

它缺少最后的换行符。

使用tr和echo

解决此问题的一种方法是:

$ tr '

' '

'

heading1        heading2        heading3        heading4        heading5        heading6        heading7

col1row1        col2row1        col3row1        col4row1        col5row1        col6row1        col7row1

col1row2        col2row2        col3row2        col4row2        col5row2        col6row2        col7row2

col1row3        col2row3        col3row3        col4row3        col5row3        col6row3

col1row4        col2row4        col3row4        col4row4

在这里,tr '

' '

'用换行符(unix样式的行尾)替换所有回车符(Mac样式的行尾)。 echo""语句添加最后一个换行符。

使用awk

$ awk 1 RS='

' test_tab_delimited.txt

heading1        heading2        heading3        heading4        heading5        heading6        heading7

col1row1        col2row1        col3row1        col4row1        col5row1        col6row1        col7row1

col1row2        col2row2        col3row2        col4row2        col5row2        col6row2        col7row2

col1row3        col2row3        col3row3        col4row3        col5row3        col6row3

col1row4        col2row4        col3row4        col4row4

这里的awk程序由单个字符1组成。这告诉awk打印它读取的每个记录

选项设置RS='

'告诉awk将回车符视为输入上的记录分隔符。

使用sed

$ sed 's/

/

/g; s/$/

/' test_tab_delimited.txt

heading1        heading2        heading3        heading4        heading5        heading6        heading7

col1row1        col2row1        col3row1        col4row1        col5row1        col6row1        col7row1

col1row2        col2row2        col3row2        col4row2        col5row2        col6row2        col7row2

col1row3        col2row3        col3row3        col4row3        col5row3        col6row3

col1row4        col2row4        col3row4        col4row4

我们在这里使用两个sed命令:

s/

/

/g告诉sed在找到的每一个地方都用换行符代替回车。

s/$/

/告诉sed在每行末尾添加最后一个换行符。这仅发生一次,因为在输入时文件没有换行符,因此sed将整个文件视为一行。

[此解决方案已在GNU(Linux)sed上进行了测试。使它在BSD(OSX)sed下运行可能需要进行一些小的更改。]

使用GNU grep

$ grep -oP '[^

]*(?=

|$)' test_tab_delimited.txt

heading1        heading2        heading3        heading4        heading5        heading6        heading7

col1row1        col2row1        col3row1        col4row1        col5row1        col6row1        col7row1

col1row2        col2row2        col3row2        col4row2        col5row2        col6row2        col7row2

col1row3        col2row3        col3row3        col4row3        col5row3        col6row3

col1row4        col2row4        col3row4        col4row4

此解决方案需要GNU grep。它不适用于Mac上安装的默认grep。

使用mac2unix

您的系统可能还安装了一个实用程序,该实用程序的名称可能类似于mac2unix,该实用程序用于执行此转换。

您如何看到Mac风格的结尾?

@nautical我从他提供的链接中下载了OPs文件。

我看到了,我从网站上复制并粘贴了它,od -a显示了正常的Unix换行符。

@ John1024我们以为你只是千里眼...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值