Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 在逗号之间每隔一秒的数字后插入字符串中的小数点_Unix_Awk_Sed - Fatal编程技术网

Unix 在逗号之间每隔一秒的数字后插入字符串中的小数点

Unix 在逗号之间每隔一秒的数字后插入字符串中的小数点,unix,awk,sed,Unix,Awk,Sed,我需要在逗号之间的每个字符串的第二个数字后插入一个小数点 some.file: 尝试的代码: 电流输出: 预期产出: 我尝试的代码似乎只抓取了第二个逗号之前的数字字符串,而不是行中的每个数字字符串,不管逗号是什么。使用: $ echo "JAN,334,333,332,331,330,330,329,328,328,327,327,327" |sed -e "s/\([0-9]\{2\}\)/\1./g" JAN,33.4,33.3,33.2,33.1,33.0,33.0,32.9,32.8,3

我需要在逗号之间的每个字符串的第二个数字后插入一个小数点

some.file:

尝试的代码:

电流输出:

预期产出:

我尝试的代码似乎只抓取了第二个逗号之前的数字字符串,而不是行中的每个数字字符串,不管逗号是什么。

使用:

$ echo "JAN,334,333,332,331,330,330,329,328,328,327,327,327" |sed -e "s/\([0-9]\{2\}\)/\1./g"
JAN,33.4,33.3,33.2,33.1,33.0,33.0,32.9,32.8,32.8,32.7,32.7,32.7
对于就地更换:

sed -i -e "s/\([0-9]\{2\}\)/\1./g" some.file
此处不需要,但更安全的版本可能是:

sed -i -e 's/,\([0-9]\{2\}\)\([0-9]\)/,\1.\2/g' some.file
使用:

对于就地更换:

sed -i -e "s/\([0-9]\{2\}\)/\1./g" some.file
此处不需要,但更安全的版本可能是:

sed -i -e 's/,\([0-9]\{2\}\)\([0-9]\)/,\1.\2/g' some.file
您可以按如下方式使用Awk

awk 'BEGIN{FS=OFS=","}{for(i=2;i<=NF;i++) if (length($i) >2) { $i=substr($i,0,2)"."substr($i,3,length($i)); } }1' file
其思想是从第二条记录开始循环通过元素,直到$NF为止,并对超过2位的数字应用逻辑

是一个POSIX兼容函数,用于从当前处理的记录中获取子字符串

子字符串,开始[,长度]

返回字符串的长字符子字符串,从字符数开始。字符串的第一个字符是第一个字符。

您可以按如下方式使用Awk

awk 'BEGIN{FS=OFS=","}{for(i=2;i<=NF;i++) if (length($i) >2) { $i=substr($i,0,2)"."substr($i,3,length($i)); } }1' file
其思想是从第二条记录开始循环通过元素,直到$NF为止,并对超过2位的数字应用逻辑

是一个POSIX兼容函数,用于从当前处理的记录中获取子字符串

子字符串,开始[,长度]

返回字符串的长字符子字符串,从字符数开始。字符串的第一个字符是第一个字符。

另一个awk,将所有数字除以10,并用一个小数点打印

awk -v RS=, '{if($1==$1+0) printf "%.1f,", $1/10; else printf "%s,",$1}' file | 
sed '$s/,$/\n/'

JAN,33.4,33.3,33.2,33.1,33.0,33.0,32.9,32.8,32.8,32.7,32.7,32.7
另一个awk,将所有数字除以10,并用一个小数点打印

awk -v RS=, '{if($1==$1+0) printf "%.1f,", $1/10; else printf "%s,",$1}' file | 
sed '$s/,$/\n/'

JAN,33.4,33.3,33.2,33.1,33.0,33.0,32.9,32.8,32.8,32.7,32.7,32.7

在awk中使用正则表达式替换:

$ awk 'gsub(/[0-9],|[0-9]$/,".&")||1' file
JAN,33.4,33.3,33.2,33.1,33.0,33.0,32.9,32.8,32.8,32.7,32.7,32.7
解释:

gsub/[0-9],|[0-9]$/,.&将所有数字+逗号替换为句点+该数字+逗号,并保留记录末尾的最后一个数字 ||或 我还是把它打印出来
在awk中使用正则表达式替换:

$ awk 'gsub(/[0-9],|[0-9]$/,".&")||1' file
JAN,33.4,33.3,33.2,33.1,33.0,33.0,32.9,32.8,32.8,32.7,32.7,32.7
解释:

gsub/[0-9],|[0-9]$/,.&将所有数字+逗号替换为句点+该数字+逗号,并保留记录末尾的最后一个数字 ||或 我还是把它打印出来
sed的另一种方法:

sed -e "s/\b[0-9][0-9]/&./g"

sed的另一种方法:

sed -e "s/\b[0-9][0-9]/&./g"
您只错过了替换所有事件的g标志,而不仅仅是第一个。您只错过了替换所有事件的g标志,而不仅仅是第一个。这将把2017年1月转换为2017年1月20日。这将把2017年1月转换为2017年1月20日。