Linux 如何使用sed转换不均匀的制表符分隔文件?
如何使用sed命令将不均匀的制表符分隔输入文件转换为CSV或PSVLinux 如何使用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
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'
vsecho'03'| awk'{$1=$1}1'
,它将“41.890066,-71.548680”
转换为“41.890066 |,|-71.548680”
我会感到惊讶的是,这是可取的,但由于OP没有发布预期的输出,我们都只是猜测。不客气,但我怀疑真正的解决方案是不修改双引号内的任何空格(如果我们在您的回答中假设OP希望将“字段”之间的所有空格转换为管道,而不仅仅是转换制表符).