我在文件存储中的数据如下所示:
3.172704445659,50.011996744997,3.1821975358417,50.012335988197,3.2174797791605,50.023182479597
我想要两个专栏:
3.172704445659 50.011996744997
3.1821975358417 50.012335988197
3.2174797791605 50.023182479597
我知道删除','的sed命令(sed"s/,//"(,但我不知道如何"删除";返回行";每两位数?
你有什么想法吗?
awk中的一个:
$ awk -F, '{for(i=1;i<=NF;i++)printf "%s%s",$i,(i%2&&i!=NF?OFS:ORS)}' file
输出:
3.172704445659 50.011996744997
3.1821975358417 50.012335988197
3.2174797791605 50.023182479597
对于那些不了解awk
命令的人来说,解决方案是可行的——在数字数组上进行简单的for
循环。
IFS=',' read -ra NUMBERS < file
NUMBERS_ON_LINE=2
INDEX=0
for NUMBER in "${NUMBERS[@]}"; do
if (($INDEX==$NUMBERS_ON_LINE-1)); then
INDEX=0
echo "$NUMBER"
else
((INDEX++))
echo -n "$NUMBER "
fi
done
由于您已经尝试过sed
,下面是一个使用sed的解决方案:
sed -r "s/(([^,]*,){2})/1n/g; s/,n/n/g" YOURFILE
-r
使用sed扩展正则表达式- 使用了两个替换:
- 具有
(([^,]*,){2})
部分的第一个替换同时捕获两个逗号分隔的数字,并将它们存储到1
中以供重用:在您的示例中,1
在第一个匹配处保持:3.172704445659,50.011996744997,
。注意:两个逗号都存在。(([^,]*,){2})
表示捕获一个由NOT逗号组成的序列,即[^,]*
部分后面跟着,
- 我们想要两个这样的序列,即
(...){2}
部分 - 并且我们想要捕获它以便在
1
中重用——也就是外括号对 - 然后用
1n
替换-只在匹配后插入换行符,换句话说,在每秒钟逗号后插入一个换行符
- 由于我们现在在需要去掉的换行符之前有一个逗号,我们进行了第二次替换来实现这一点:
s/,n/n/g
- 后面跟着换行符的逗号只替换为换行符-换句话说,逗号被删除
- 具有
awk
和sed
是功能强大的工具,实际上它们本身就构成了编程语言。因此,他们当然可以轻松地处理这项任务。
但是bash
也是如此,它将具有更可移植性(没有外部依赖性(和执行速度更快(因为它只使用内置函数(的好处:
IFS=$', n'
values=($(</path/to/file))
printf '%.13f %.13fn' "${values[@]}"