텍스트 파일에서 두 줄을 가져와 한 줄에 따라 열을 형성하는 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번 반복합니다.

문제는 실제로 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를 사용할 수 없습니다. 이것은 현재 내 오류이지만 더 많은 오류가 있을 것으로 생각됩니다. 나는 다른 접근 방식에 열려 있습니다.

  • 두 개의 행 번호를 입력으로 사용하여 단일 행을 따라 열로 정렬하는 자동 방법이 있습니까?
  • 이 행을 다른 열로 시작하는 자동 방법이 있습니까? 그룹 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

관련 정보