Linux 如何使用sed转换不均匀的制表符分隔文件?

Linux 如何使用sed转换不均匀的制表符分隔文件?,linux,bash,awk,sed,Linux,Bash,Awk,Sed,如何使用sed命令将不均匀的制表符分隔输入文件转换为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

如何使用sed命令将不均匀的制表符分隔输入文件转换为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+/|/g'
但结果并不像预期的那样。

呆呆地看着救援人员

$ 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
将字段模式定义为非空格或可能包含空格(但不包含转义引号)的带引号的值,将输出字段替换为以tab分隔的字段,强制解析该行,并在格式更改后打印非零行

更好的版本应该是
…'{$1=$1;print}'


当然,如果所有字段分隔符都是制表符,而引号字符串不包含任何制表符,那么就简单多了。

您的问题不清楚,但这就是您想要做的吗

$ 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"
$printf'now\t“是冬季”\t\t“我们的不满”\n'>文件
$cat文件
现在是“我们的不满”的“冬天”
$tr'\t'','<文件
现在,“是冬天”的“我们的不满”
$tr'\t'|'<文件
现在是“我们的不满”的“冬天”

您最初的答案非常接近:

sed 's/[[:space:]]\+/|/g' input.txt
说明:
[[:space:]
匹配单个空格字符,例如空格/tab/CR/newline

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

更新: 如果需要2个或更多空格

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

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

您期望什么?结果与您的期望有什么不同?
更好的版本应该是…'{$1=$1;print}'
-FWIW我非常同意:-)。如果需要,您应该仅将操作的结果用作条件-请参见
echo'03'| awk'$1=$1'
vs
echo'03'| awk'{$1=$1}1'
,它将
“41.890066,-71.548680”
转换为
“41.890066 |,|-71.548680”
我会感到惊讶的是,这是可取的,但由于OP没有发布预期的输出,我们都只是猜测。不客气,但我怀疑真正的解决方案是不修改双引号内的任何空格(如果我们在您的回答中假设OP希望将“字段”之间的所有空格转换为管道,而不仅仅是转换制表符).