微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

单列数据到多个列

我有一个由两个空行分隔的列中的正或负浮点值的数据。

1.0 -2.0 3.0 4.0 -5.0 6.0 -7.0 8.0

在bash中,将这些数据放入多个列的最好方法是什么,以便最终的结果如下所示:

1.0 3.0 -5.0 -7.0 -2.0 4.0 6.0 8.0

在理想情况下,解决scheme不仅适用于数字,也适用于以类似方式分隔的文本。

用于格式化pipe道分隔的分段文件的UNIX Shell脚本解决scheme

awk的多input文件

冷凝awk / sedpipe道命令

gawk windowspath名(目录)扩展(glob)

如何使用BASH脚本的AWK生成开始和结束date的date序列?

在shell脚本中,HTML如何在awk命令中工作?

如何awk -f在最后一个

使用awk提取最大值和最小值

通过Bash ShellScripting从url列表中提取父域名

awk用于比较,select和处理列

怎么样:

$ grep -v '^s*$' file | pr -ts" " --columns 4 1.0 3.0 -5.0 -7.0 -2.0 4.0 6.0 8.0

grep用于删除空行和pr来格式化输出

这可能适用于你(GNU sed):

sed -r '/./!d;$!N;2{h;d};G;s/^(.*)n(.*)n(.*)n(.*)$/3 1n4 2/;$!{h;d}' file

/./!d如果该行不包含一个字符就删除它。

$!N如果行不是最后一行,则在模式空间(PS)附加一个换行符和下一行。

2{h;d}为第二行,将PS复制到保存空间(HS),然后删除它。

G为所有其他行添加HS到PS。

s/^(.*)n(.*)n(.*)n(.*)$/3 1n4 2/重新排列PS到需要的顺序。

$!{h;d}为除最后一行之外的所有行将PS复制到HS,然后删除PS。 这意味着在遇到最后一行时,PS的内容将被打印出来。

这是一个更长,但更可读的解决方案:

a=() b=() i=0 while read line ; do case $i in 0) a+=($line) ;; 1) b+=($line) ;; esac ((i++)) if ((i == 4)); then i=0; fi done < data.txt echo ${a[*]} echo ${b[*]}

假设你的数据在文件data.txt中; 你可以试试这个:

a=($(< data.txt)) b(){ for((i=$1; i<${#a[*]}; i+=2)); do echo -n "${a[$i]} "; done; echo ;} b 0 b 1

这当然不是最好的方法,但它的工作原理!

你也可以xargs first用xargs first尝试“按摩”输入

while read ab do A+=($a) B+=($b) done < <( xargs -n2 < file ) printf "%sn" "${A[*]}" "${B[*]}"

要么

while read a; read b; do read; read; A+=($a) B+=($b) done < file printf "%sn" "${A[*]}" "${B[*]}"

使用awk的单个调用

awk 'BEGIN{RS="nnn"}{A=A " " $1;B=B " " $2}END{printf A "n" B "n"}' NewFile

仅使用posix外壳(内置)

#!/bin/sh L="" R="" while read A && read B && read dummy && read dumtwo || [ "$A" ];do L="$L $A" R="$R $B" done < NewFile echo $L echo $R

注意:不是将变量存储在字符串$ L和$ R中,而是使用bash数组,而不是使用L_ARRAY + =(“$ A”)或者像这样:

#!/bin/bash L=() R=() while read A && read B && read dummy && read dumtwo || [ "$A" ];do L[${#L[@]}]=${A} R[${#R[@]}]=${B} done < NewFile echo -e "${L[@]}n${R[@]}"

或使用sed(2个调用

L=`sed -n 1~4p NewFile` R=`sed -n 2~4p NewFile` echo $L echo $R

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐