Как распечатать файл с разделителями табуляции в терминале

Я экспортировал данные Excel в текстовый файл с разделителями табуляцией, но мне трудно распечатать его в терминале, вот файл:

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-скрипт, которому нужны входные теги, поэтому я просто сначала печатаю теги и выбираю правильные теги из напечатанного списка

1 ответ

Решение

Есть две проблемы с вашим файлом:

  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' заменяет все символы возврата каретки (окончания строки в стиле 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, Не будет работать по умолчанию grep установлен на Mac.

Использование mac2unix

В вашей системе также может быть установлена ​​утилита, которая может иметь имя mac2unix, что сделано, чтобы сделать это преобразование.

Другие вопросы по тегам