如何使用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'
,但结果不符合预期。
答案 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,\}
匹配当前抓取中的两个或多个。