テキストファイルから2行を取得し、1行に沿って列を形成するbashスクリプト

テキストファイルから2行を取得し、1行に沿って列を形成する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回繰り返します。

問題は、実際には4つの数字で構成される2セットではなく、それぞれ34個の数字で構成された7セットがあるため、合計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を使用することはできません。これは現在私のエラーですが、より多くのエラーがあると思います。私は別のアプローチで開いています。

  • 2つの行番号を入力として使用して単一の行に沿って列にソートする自動方法はありますか?
  • この行を別の列で開始する自動方法はありますか?グループ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

おすすめ記事