Как преобразовать неравномерный файл, разделенный табуляцией, используя sed? - PullRequest
0 голосов
/ 01 мая 2019

Как преобразовать неравномерный входной файл, разделенный TAB, в CSV или PSV с помощью команды sed?

28828082-1      04/08/19 08:48  04/11/19 12:37  04/12/19 16:22  4/15-4/16       04/17/19        2       9       LCO     W                       OIP     04/08/19 08:53 21       1       58.00           9       222     79      FEDX    FEDXH   SL3     484657064673    0410099900691041119             SMITHFIELD      RI      02917   "41.890066 , -71.548680"        YES

Выше 1 строки, я пытался использовать sed -r 's/^\s+//;s/\s+/|/g', но результат оказался не таким, как ожидалось.

Ответы [ 3 ]

1 голос
/ 01 мая 2019

Ваш вопрос неясен, но вы пытаетесь это сделать?

$ printf 'now\t"is the winter"\tof\t"our discontent"\n' > file
$ cat file
now     "is the winter" of      "our discontent"

$ tr '\t' ',' < file
now,"is the winter",of,"our discontent"

$ tr '\t' '|' < file
now|"is the winter"|of|"our discontent"
1 голос
/ 01 мая 2019

gawk на помощь!

$ awk -vFPAT='([^[:space:]]+)|("[^"]+")' -v OFS='|' '$1=$1' file

28828082-1|04/08/19|08:48|04/11/19|12:37|04/12/19|16:22|4/15-4/16|04/17/19|2|9|LCO|W|OIP|04/08/19|08:53|21|1|58.00|9|222|79|FEDX|FEDXH|SL3|484657064673|0410099900691041119|SMITHFIELD|RI|02917|"41.890066 , -71.548680"|YES

определяет шаблон поля как непустое или заключенное в кавычки значение, которое может включать пробелы (но не экранированные кавычки), заменять поле вывода, разделенное символом табуляции, принудительно анализировать строку, и после изменения формата будут напечатаны ненулевые строки.

Лучшая версия будет ... '{$1=$1; print}'.

Конечно, если все разделители полей являются вкладками, а строка кавычек не содержит вкладок, это намного проще.

0 голосов
/ 01 мая 2019

Ваш первоначальный ответ был очень близок:

sed 's/[[:space:]]\+/|/g' input.txt

Пояснение:

[[:space:]] Соответствует одному пробелу, например пробелу / табуляции / CR / символу новой строки.

\+ Соответствует одному или нескольким текущим захватам.

Обновление:

Если вам требуется 2 или более пробелов.

sed 's/[[:space:]]\{2,\}/|/g' input.txt

\{2,\} Совпадение двух или более текущих захватов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...