Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
Linux 如何使用shell将值逐二转置?_Linux_Bash_Shell - Fatal编程技术网

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
  • -r
    使用sed扩展regexp
  • 使用了两种替换:
  • 第一个替换是
    ([^,]*,){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[@]}"