如何在终端中打印制表符分隔的文件
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 脚本,所以我只是先打印标签,然后从打印列表中选择正确的标签
您的文件有两个问题:
它有旧的 Mac 风格的行尾。这些导致 Unix 终端上的输出以令人困惑的方式被覆盖
缺少最后的换行符。
使用 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
,用于执行此转换。
我将 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 脚本,所以我只是先打印标签,然后从打印列表中选择正确的标签
您的文件有两个问题:
它有旧的 Mac 风格的行尾。这些导致 Unix 终端上的输出以令人困惑的方式被覆盖
缺少最后的换行符。
使用 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
,用于执行此转换。