如何使用sed转换不规则的制表符分隔的文件?

时间:2019-05-01 10:18:42

标签: linux bash awk sed

如何使用sed命令将不规则的TAB分隔的输入文件转换为CSV或PSV?

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

答案 0 :(得分:1)

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}'

当然,如果所有字段定界符都是制表符,并且引号字符串不包含任何制表符,则要简单得多。

答案 1 :(得分:1)

您的问题尚不清楚,但这是您要尝试的吗?

$ 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"

答案 2 :(得分:0)

您的最初答案非常接近:

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

说明:

[[:space:]]匹配单个空格字符,例如space / tab / CR / newline。

\+匹配当前抓取中的一个或多个。

更新:

如果您需要2个或更多的空格。

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

\{2,\}匹配当前抓取中的两个或多个。