一个 bash 脚本,用于在文本文件中取出两行并沿一行形成列

一个 bash 脚本,用于在文本文件中取出两行并沿一行形成列

我刚刚开始使用 bash 是为了让实习的跑腿工作变得更容易。因此,如果我最初的尝试如此偏离目标而没有帮助,我提前表示歉意。请随时要求澄清。

我的输入类似于:

Set1
1
2
3
4
Set2
5
6
7
8

我希望我的输出是:

group1  1   5
group1  2   6
group2  3   7
group2  4   8

所以我可以做

A=$(sed -n '2p' input)
B=$(sed -n '7p' input)

printf "group1\t$A\t$B" >> output

并重复此操作 3 次。

问题是,我实际上有 7 组,每组 34 个数字,而不是 2 组,每组 4 个数字,所以总共大约 200-300 个。这就是为什么我想制作一个脚本来自动执行此任务。

对于前 17 个数字(第 1 组),我有:

#!/bin/bash


##############################################################################
#group1


for (( i=0; i<=16; i++ )) ;
do

A=$(echo "scale=1;x=2+$i; x" |bc -l)

B=$(echo "scale=1;x=128+$i; x" |bc -l)

C=$(sed -n "$Ap" input)

D=$(sed -n "$Bp" input)

printf "group1\t$C\t$D\n" >> output


done   

当然,它根本不起作用,可能有很多原因。一方面,我实际上无法使用 sed 使用变量作为行号的输入来过滤特定行。这是我当前的错误,但我怀疑还会有更多错误。我对其他方法持开放态度。

  • 是否有一种自动方法将两个行号作为输入并将它们沿单行排列在列中?
  • 是否有一种自动方法可以使这一行以另一列开始,例如。组1/组1/组2/组2?

感谢您的任何建议。

答案1

如果您想要一些快速而肮脏的方法来对数据进行列化,您可以尝试pr

pr -t -2 input
Set1                                Set2
1                                   5
2                                   6
3                                   7
4                                   8

pr -t -7 input17x7
Set1      Set2      Set1      Set2      Set1      Set2      Set1
1         a         1         a         1         a         1
2         b         2         b         2         b         2
3         c         3         c         3         c         3
4         d         4         d         4         d         4
5         e         5         e         5         e         5
6         f         6         f         6         f         6
7         g         7         g         7         g         7
8         h         8         h         8         h         8
9         i         9         i         9         i         9
10        j         10        j         10        j         10
11        k         11        k         11        k         11
12        l         12        l         12        l         12
13        m         13        m         13        m         13
14        n         14        n         14        n         14
15        o         15        o         15        o         15
16        p         16        p         16        p         16
17        q         17        q         17        q         17

为了更好地控制,有rs实用程序。例如,您可以这样做:

{ printf 'Group\n' ; printf 'group%d\n' {1..17} ; cat input17x7; } | rs -et 18 8
Group    Set1     Set2     Set1     Set2     Set1     Set2     Set1
group1   1        a        1        a        1        a        1
group2   2        b        2        b        2        b        2
group3   3        c        3        c        3        c        3
group4   4        d        4        d        4        d        4
group5   5        e        5        e        5        e        5
group6   6        f        6        f        6        f        6
group7   7        g        7        g        7        g        7
group8   8        h        8        h        8        h        8
group9   9        i        9        i        9        i        9
group10  10       j        10       j        10       j        10
group11  11       k        11       k        11       k        11
group12  12       l        12       l        12       l        12
group13  13       m        13       m        13       m        13
group14  14       n        14       n        14       n        14
group15  15       o        15       o        15       o        15
group16  16       p        16       p        16       p        16
group17  17       q        17       q        17       q        17

如果您不需要标头,请通过管道传输结果tail -n +2

相关内容