내가 가지고 있는 많은 데이터 파일 중 더 작은 버전은 다음과 같습니다.
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을 배열에 저장하고
a
0부터 각 줄의 줄 수까지 인덱스를 지정합니다. 그런 다음$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