删除逗号和 -

时间:2016-02-09 21:47:24

标签: bash awk sed

如何在bash中清理以下行

-,2,8,--,-,2,6,--,-,-1,2,--,-,0,4,--,-,1,5,--,-,-5,2

以获得

 2,8,2,6,-1,2,0,4,1,5,-5,2

我只想要用逗号分隔的正数和负数

4 个答案:

答案 0 :(得分:2)

您可以通过此sed脚本运行它:

sed -e 's/--*,//g' -e 's/,--*$//'

消除由一个或多个减号(-)组成的每个子字符串,后跟一个逗号(,),以及另外一个由逗号后跟一个或多个组成的尾随子字符串减号。

答案 1 :(得分:1)

gnu-awk解决方案:

str='-,2,8,--,-,2,6,--,-,-1,2,--,-,0,4,--,-,1,5,--,-,-5,2'
awk -v FPAT='-?[0-9]+' '{for(i=1; i<=NF; i++) printf "%s%s", $i, (i<NF)?",":RS}' <<< "$str"
2,8,2,6,-1,2,0,4,1,5,-5,2

非gnu awk解决方案:

str=$(awk 'BEGIN{RS=ORS=","} /^-?[[:digit:]]+/{print $1}' <<< "$str")

输出:

echo "${str%,}"
2,8,2,6,-1,2,0,4,1,5,-5,2

答案 2 :(得分:0)

尝试:

egrep -o "\-?[0-9]+" | sed ':a;N;$!ba;s/\n/,/g'

或:

egrep -o "\-?[0-9]+" | xargs | sed 's/ /,/g'

答案 3 :(得分:0)

$ awk 'BEGIN{FS=OFS=","} {j=0; for (i=1;i<=NF;i++) if ($i~/^-?[0-9]/) printf "%s%s", (++j>1?OFS:""), $i; print ""}' file 
2,8,2,6,-1,2,0,4,1,5,-5,2

循环遍历每个字段,测试当前字段是否可选地以-开头。如果是,那么如果它是行上的第一个匹配字段或输出字段分隔符,则打印前面没有任何内容的字段。完成打印后,字段会打印换行符。