마지막 행 뒤에 텍스트 파일의 열을 추가합니다.

마지막 행 뒤에 텍스트 파일의 열을 추가합니다.

내가 가지고 있는 많은 데이터 파일 중 더 작은 버전은 다음과 같습니다.

0 0 0
0.05 9.6877884e-06 0.0024898597
0.1 4.2838688e-05 0.0049595502
0.15 0.00016929444 0.0074092494
0.2 0.00036426881 0.009839138
0.25 0.00055234582 0.012249394
0.3 0.00077448576 0.014640196
0.35 0.00082546537 0.017011717
0.4 0.0012371619 0.019364133
0.45 0.0013286382 0.02169761

첫 번째 열이 반복되고 두 번째 열의 항목에 원본 파일의 열 2 이상이 포함되는 다음과 유사한 결과를 원합니다.

0 0
0.05 9.6877884e-06
0.1 4.2838688e-05
0.15 0.00016929444
0.2 0.00036426881
0.25 0.00055234582
0.3 0.00077448576
0.35 0.00082546537
0.4 0.0012371619
0.45 0.0013286382
0 0
0.05 0.0024898597
0.1 0.0049595502
0.15 0.0074092494
0.2 0.009839138
0.25 0.012249394
0.3 0.014640196
0.35 0.017011717
0.4 0.019364133
0.45 0.021697611

awk '{print $1 " " $2}' data > tmp후자를 사용하여 생성할 수 있지만 awk '{print $1 " " $3}' data >> tmp열 수가 많아지면 매우 지루해집니다.

필요한 것을 달성하는 더 현명한 방법이 있습니까?

편집하다

나는 임의 개수의 열 n에 대한 솔루션을 원합니다. 내 필요에 따라 열과 행의 올바른 순서가 중요합니다. 따라서 입력의 열 3은 입력의 열 2 아래로 "이동"해야 하고, 열 4는 열 2와 3 아래에 있어야 하며, 열 1은 그 아래에 쌓여 있어야 합니다. 열당 행 수에 관계없이 첫 번째 열은 오름차순이어야 합니다(예: 0, 0.05, ..., 0.45, 0, 0.05,..., 0.45, 0,0.05,...,0.45, 등.

답변1

awk 스크립트는 2보다 많은 열에서 실행되며 발생 순서는 아래에서 위로 유지되며 열이 무엇인지에 대한 가정은 이루어지지 않습니다(숫자인지, 정렬되었는지 등은 중요하지 않습니다.):

{
    for (i = 2; i <= NF; i++) {
        a[j + i] = $1 " " $i
    }
    j += (i - 1);
}
END {
    OutNR = NR * NF;
    for (i = 2; i <= NF; i++) {
        for (j = 0; j < OutNR; j += NF) { 
            print a[j + i];
        }
    }
}

반면:

0 0 0 0.2340
0.05 9.6877884e-06 0.0024898597 0.2341
0.1 4.2838688e-05 0.0049595502 0.2342
0.15 0.00016929444 0.0074092494 0.2343
0.2 0.00036426881 0.009839138 0.2344
0.25 0.00055234582 0.012249394 0.2345
0.3 0.00077448576 0.014640196 0.2346
0.35 0.00082546537 0.017011717 0.2347
0.4 0.0012371619 0.019364133 0.2348
0.45 0.0013286382 0.02169761 0.2349

열별로 정렬(2..N) 다음 줄을 누릅니다.

0 0
0.05 9.6877884e-06
0.1 4.2838688e-05
0.15 0.00016929444
0.2 0.00036426881
0.25 0.00055234582
0.3 0.00077448576
0.35 0.00082546537
0.4 0.0012371619
0.45 0.0013286382
0 0
0.05 0.0024898597
0.1 0.0049595502
0.15 0.0074092494
0.2 0.009839138
0.25 0.012249394
0.3 0.014640196
0.35 0.017011717
0.4 0.019364133
0.45 0.02169761
0 0.2340
0.05 0.2341
0.1 0.2342
0.15 0.2343
0.2 0.2344
0.25 0.2345
0.3 0.2346
0.35 0.2347
0.4 0.2348
0.45 0.2349

오른쪽

대부분의 사람들은 텍스트 처리에 R을 생각하지 않지만, 모든 옵션 설정으로 인해 실제보다 더 복잡해 보이지만 이 경우 실제로는 좀 더 간단합니다. 이 솔루션의 핵심은 단순히 rbind()멀티플렉싱 입니다 cbind().

d.in <- read.table(file = commandArgs(trailingOnly = T)[1]
                    , colClasses = "character");
d.out<-data.frame();
for (i in 2:length(d.in)) {
    d.out <- rbind(d.out, cbind(d.in[,1], d.in[,i]));
}
write.table(d.out, row.names = F, col.names = F, quote = F);

그럼 그냥:

$ Rscript script.R data.txt
0 0
0.05 9.6877884e-06
0.1 4.2838688e-05
0.15 0.00016929444
0.2 0.00036426881
0.25 0.00055234582
0.3 0.00077448576
0.35 0.00082546537
0.4 0.0012371619
0.45 0.0013286382
0 0
0.05 0.0024898597
0.1 0.0049595502
0.15 0.0074092494
0.2 0.009839138
0.25 0.012249394
0.3 0.014640196
0.35 0.017011717
0.4 0.019364133
0.45 0.02169761
0 0.2340
0.05 0.2341
0.1 0.2342
0.15 0.2343
0.2 0.2344
0.25 0.2345
0.3 0.2346
0.35 0.2347
0.4 0.2348
0.45 0.2349

답변2

순서가 중요하지 않은 경우 간단히 다음을 사용할 수 있습니다.

awk '{for(i=2;i<=NF;i++)print $1,$i}' file

답변3

해결책 은 다음과 같습니다 awk.

$ awk '{a[i++]=$1" "$3;print $1,$2}END{for(i=0;i<length(a);i++){print a[i]}}' file
0 0
0.05 9.6877884e-06
0.1 4.2838688e-05
0.15 0.00016929444
0.2 0.00036426881
0.25 0.00055234582
0.3 0.00077448576
0.35 0.00082546537
0.4 0.0012371619
0.45 0.0013286382
0 0
0.05 0.0024898597
0.1 0.0049595502
0.15 0.0074092494
0.2 0.009839138
0.25 0.012249394
0.3 0.014640196
0.35 0.017011717
0.4 0.019364133
0.45 0.02169761

설명하다

  • 파일을 처리할 때 $1과 $3을 배열에 저장하고 a0부터 각 줄의 줄 수까지 인덱스를 지정합니다. 그런 다음 $1합계를 인쇄합니다 $2.

  • 마지막으로 배열을 반복 a하고 각 요소(즉, value $1 $3)를 인쇄합니다. 인덱스를 다시 사용하여 0부터 배열 길이까지 반복하므로 순서가 유지됩니다 a.

고쳐 쓰다

모든 n 열에 대해 다음을 사용합니다 perl.

$ perl -anle '$h{$i++} = [@F[0..$#F]];
  END {
      for $j (1..$#F) {
          for (sort {$a<=>$b} keys %h) {
              print $h{$_}->[0]," ",$h{$_}->[$j]
          }
      }
  }' file

관련 정보