如何在终端中打印制表符分隔的文件

How to print tab delimited file in terminal

我将 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                        

您可以下载文本文件here

我试过使用 sed 和 awk。

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

您的文件有两个问题:

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

  2. 缺少最后的换行符。

使用 tr 和 echo

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

$ tr '\r' '\n' <test_tab_delimited.txt ; echo ""
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 '\r' '\n' 将所有回车符-return 字符(Mac 样式的行结尾)替换为换行符(unix 样式的行结尾)。 echo "" 语句添加最后一个换行符。

使用 awk

$ awk 1 RS='\r' 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='\r' 告诉 awk 将回车 return、\r 作为输入的记录分隔符。

使用 sed

$ sed 's/\r/\n/g; s/$/\n/' 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/\r/\n/g 告诉 sed 在它找到的任何地方用换行符替换回车符 returns。

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

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

使用 GNU grep

$ grep -oP '[^\r]*(?=\r|$)' 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,用于执行此转换。