使用 Shell 脚本命令从行更改为列

使用 Shell 脚本命令从行更改为列

我正在使用 UNIX 语言来提取我的文件。我用这个命令来提取它:

value_1=$(cat tmp.csv | head -1001 | cut -f 3-6 -d','> tmp1.csv)
value_2=$(cat tmp.csv | head -2002 | tail -1001 | cut -f 4-6 -d','> tmp2.csv)
paste -d ',' tmp1.csv tmp2.csv > final.csv

我的“tmp.csv”文件是:

0   0   0   17.92204    -3.017933   35.14229
1   0   1   18.27151    -3.179997   35.20044
2   0   2   18.22776    -3.566021   34.87167
                      .
                      .
0   1   0   20.89817    -2.37854    66.51003
1   1   1   21.48396    -2.461451   66.48988
2   1   2   21.78348    -2.575202   66.51389

但结果是这样的:

0   17.92204    -3.017933   35.14229
    20.89817    -2.37854    66.51003
1   18.27151    -3.179997   35.20044
    21.48396    -2.461451   66.48988
2   18.22776    -3.566021   34.87167
    21.78348    -2.575202   66.51389

我想得到这样的结果:

0   17.92204    -3.017933   35.14229    20.89817    -2.37854    66.51003
1   18.27151    -3.179997   35.20044    21.48396    -2.461451   66.48988
2   18.22776    -3.566021   34.87167    21.78348    -2.575202   66.51389

我想知道是否可以在不手动处理的情况下实现这一目标?

答案1

如果我们可以基于第一行有 4 个项目、第二行有 3 个项目的事实,我们可以使用 awk 来执行此操作:

$ cat input-file | awk '{if(NF==4){aa=$0} else {print aa" "$0;}}' > output-file

答案2

您在问题中提到的先前输出我相信这是 Final.csv 的输出

0   17.92204    -3.017933   35.14229
    20.89817    -2.37854    66.51003
1   18.27151    -3.179997   35.20044
    21.48396    -2.461451   66.48988
2   18.22776    -3.566021   34.87167
    21.78348    -2.575202   66.51389

使用这个命令

cat final.csv | sed "N;s/\n/ /g"

输出

0   17.92204    -3.017933   35.14229     20.89817    -2.37854    66.51003
1   18.27151    -3.179997   35.20044     21.48396    -2.461451   66.48988
2   18.22776    -3.566021   34.87167     21.78348    -2.575202   66.51389

相关内容