n개의 열을 함께 추가

n개의 열을 함께 추가

변수 y가 공간(x)과 시간(t)의 함수로 어떻게 변하는지 보여주는 대규모 데이터 세트가 있습니다. n개의 열이 있으며 각 열은 시간 단계를 나타냅니다. 탭으로 구분됩니다.

참고: 실제 텍스트 파일에는 헤더가 없으며 설명을 위해 여기에 추가되었습니다. 또한 출력에는 헤더가 없어야 합니다.

x   y(0)   y(1)    y(2)    y(3) ... y(n)
1   4      4.5     5       5.5  ... 100
2   5      5.5     6       6.5  ... 101
3   7      8       9       10   ... 102
4   10     12      14      16   ... 103

t, x, y의 3개 열만 갖도록 파일을 재구성해야 합니다. 이 열은 아래와 같이 순서대로 정렬되어야 합니다.

0 1 4
0 2 5
0 3 7
0 4 10
1 1 4.5
1 2 5.5
1 3 8
1 4 12
2 1 5
2 2 6
2 3 9
2 4 14
3 1 5.5
3 2 6.5
3 3 10
3 4 16
etc

어떤 도움이라도 대단히 감사하겠습니다. 나는 awk를 사용하는 것이 트릭을 수행해야 한다고 생각하지만 어떤 솔루션이라도 가능합니다.

답변1

암소 비슷한 일종의 영양awk해결책:

awk '{
         k=NR; x[k]=$1;
         for (i=2; i<=NF; i++) 
             t[i-1][k]=$i 
     }
     END{
         for (i in t) 
             for (j in t[i]) 
                 print i-1, x[j], t[i][j] 
     }' file
  • k=NR- 키 키 반영기능 y축 값( NR-레코드 수)
  • x[k]=$1- 축의 가치를 포착하라x
  • for (i=2; i<=NF; i++)- 두 번째 필드부터 반복 시작
    • t[i-1][k]=$i- 채우다타임라인t정렬기능 y가치

산출:

0 1 4
0 2 5
0 3 7
0 4 10
1 1 4.5
1 2 5.5
1 3 8
1 4 12
2 1 5
2 2 6
2 3 9
2 4 14
3 1 5.5
3 2 6.5
3 3 10
3 4 16
...

답변2

시간이 지남에 따라 반복해도 괜찮다면 다음을 수행하세요 n.

n=4   ### your N here
for((t=0; t <= n)); t++))
do 
  awk -F$'\t' -v t=$t '{print t, $1, $(t+2)}' < input
done > output

답변3

GNU의 대안datamash+awk해결책:

datamash -W transpose <filename \
| awk 'NR==1{ for(i=1; i<=NF; i++) x[i]=$i }
       NR > 1{
           for (i=1; i<=NF; i++) print NR-2, x[i], $i 
       }'

산출:

0 1 4
0 2 5
0 3 7
0 4 10
1 1 4.5
1 2 5.5
1 3 8
1 4 12
2 1 5
2 2 6
2 3 9
2 4 14
3 1 5.5
3 2 6.5
3 3 10
3 4 16

관련 정보