Linux 如何使用shell将值逐二转置?
我将数据存储在文件存储中,存储行如下所示:Linux 如何使用shell将值逐二转置?,linux,bash,shell,Linux,Bash,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“s/,/”)的sed命令
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“s/,/”)的sed命令,但我不知道如何每隔两位数“返回到行”
你有什么想法吗?awk中的一个:
$ awk -F, '{for(i=1;i<=NF;i++)printf "%s%s",$i,(i%2&&i!=NF?OFS:ORS)}' file
对于不知道
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
IFS=”,“读取ra编号<文件
线上的数字=2
索引=0
对于“${NUMBERS[@]}”中的数字;做
如果($INDEX==$NUMBERS\u在第1行上));然后
索引=0
回显“$NUMBER”
其他的
((索引++))
echo-n“$NUMBER”
fi
完成
既然您已经尝试了sed
,下面是一个使用sed的解决方案:
sed -r "s/(([^,]*,){2})/\1\n/g; s/,\n/\n/g" YOURFILE
使用sed扩展regexp-r
- 使用了两种替换:
- 第一个替换是
部分,它一次捕获两个逗号分隔的数字,并将它们存储到([^,]*,){2}
中以供重用:\1
在您的示例中第一次匹配时保持不变:\1
。注意:两个逗号都存在。3.172704445659,50.011996744997,
表示捕获由非逗号组成的序列-即(([^,]*,){2})
部分后跟[^,]*
,
- 我们需要两个这样的序列,即
部分(…){2}
- 我们想在
中捕获它以供重用,这是一对外圆括号\1
- 然后替换为
——只在匹配后插入换行符,换句话说,在每秒钟的逗号后插入一个换行符\1\n
- 现在我们需要去掉换行符前的逗号,我们进行第二次替换以实现这一点:
s/,\n/\n/g
- 后跟换行符的逗号将被替换为仅换行符-换句话说,逗号将被删除
awk
和sed
是功能强大的工具,事实上它们本身就构成了编程语言。因此,他们当然可以轻松地处理这项任务
但是bash
也可以,它的优点是可移植性更强(没有外部依赖),执行速度更快(因为它只使用内置函数):
IFS=$,\n
value=($(printf
是您的朋友。
sed -r "s/(([^,]*,){2})/\1\n/g; s/,\n/\n/g" YOURFILE
IFS=$', \n'
values=($(</path/to/file))
printf '%.13f %.13f\n' "${values[@]}"