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

时间:2016-05-08 05:13:15

标签: bash awk printf line-endings

我将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 个答案:

答案 0 :(得分:6)

您的文件存在两个问题:

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

  2. 缺少最终换行符。

  3. 使用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'用换行符替换所有回车字符(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将回车符\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将回车替换为找到的换行符。

    • 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,用于执行此转换。