如何使用shell将值逐个转置



我在文件存储中的数据如下所示:

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扩展正则表达式
  • 使用了两个替换:
    1. 具有(([^,]*,){2})部分的第一个替换同时捕获两个逗号分隔的数字,并将它们存储到1中以供重用:在您的示例中,1在第一个匹配处保持:3.172704445659,50.011996744997,。注意:两个逗号都存在。
      • (([^,]*,){2})表示捕获一个由NOT逗号组成的序列,即[^,]*部分后面跟着,
      • 我们想要两个这样的序列,即(...){2}部分
      • 并且我们想要捕获它以便在1中重用——也就是外括号对
      • 然后用1n替换-只在匹配后插入换行符,换句话说,在每秒钟逗号后插入一个换行符
    2. 由于我们现在在需要去掉的换行符之前有一个逗号,我们进行了第二次替换来实现这一点:
      • s/,n/n/g
      • 后面跟着换行符的逗号只替换为换行符-换句话说,逗号被删除

awksed是功能强大的工具,实际上它们本身就构成了编程语言。因此,他们当然可以轻松地处理这项任务。

但是bash也是如此,它将具有更可移植性(没有外部依赖性(和执行速度更快(因为它只使用内置函数(的好处:

IFS=$', n'
values=($(</path/to/file))
printf '%.13f %.13fn' "${values[@]}"

相关内容

  • 没有找到相关文章

最新更新