나는 내가 진행하고 있던 실험에 대해 100명이 넘는 참가자로부터 반응 시간 데이터를 수집했습니다. 불행히도 필드 사이의 구분 기호가 일관되지 않았지만 sed를 약간 조작한 후 문제를 해결할 수 있었습니다.
실험은 청크(참가자당 5개)로 나뉘며, 필요한 것은 각 청크가 쉼표로 구분된 자체 라인에 출력되는 것입니다.
내 데이터 파일의 예는 다음과 같습니다.
Participant: 2456, Test: Optimism IAT. Format is stimulus , correct(1)/incorrect(0) , time(ms). Writes 10 trials per line.
17/01/2011, 12:46:03 ,
Block 1: , Theirs , 1 , 1921 , Myself , 1 , 928 , Them , 1 , 716 , Theirs , 1 , 720 , Myself , 1 , 533 , Me , 1 , 596 , Themselves , 1 , 527 , Myself , 1 , 656 , Mine , 1 , 551 , Myself , 1 , 624
, Themselves , 1 , 570 , Me , 1 , 514
,Block 1 Time,: 8856 ,
Block 2: , Failing , 1 , 1835 , Happy , 1 , 1118 , Sad , 1 , 673 , Succeeding , 1 , 690 , Improving , 1 , 795 , Succeeding , 1 , 602 , Worse , 1 , 586 , Succeeding , 1 , 553 , Improving , 1 , 619 , Disimproving , 1 , 659
, Succeeding , 1 , 596 , Failing , 1 , 539
,Block 2 Time,: 9265 ,
Block 3: , Succeeding , 1 , 2881 , Disimproving , 1 , 1072 , Mine , 1 , 1120 , Me , 1 , 627 , Happy , 1 , 669 , Theirs , 1 , 1539 , Worse , 1 , 841 , Me , 1 , 862 , Sad , 1 , 1370 , Succeeding , 1 , 1115
, Worse , 1 , 855 , Theirs , 1 , 792 , Them , 1 , 627 , Better , 1 , 735 , Me , 1 , 626 , Happy , 1 , 622 , Succeeding , 1 , 616 , Mine , 1 , 646 , Them , 1 , 599 , Disimproving , 1 , 607
, Better , 1 , 799 , Myself , 1 , 1408 , Me , 1 , 463 , Better , 1 , 839 , Failing , 1 , 602 , Mine , 1 , 633 , Better , 1 , 525 , Sad , 1 , 573 , Worse , 1 , 770 , Me , 1 , 508
, Theirs , 1 , 613 , Disimproving , 1 , 649 , Improving , 1 , 701 , Theirs , 1 , 590 , Disimproving , 1 , 716 , Better , 1 , 714
,Block 3 Time,: 29924 ,
Block 4: , Them , 1 , 1659 , Myself , 1 , 1036 , Themselves , 1 , 595 , Me , 1 , 509 , Myself , 1 , 648 , Themselves , 1 , 542 , Myself , 1 , 536 , Mine , 1 , 537 , Theirs , 1 , 615 , Mine , 1 , 520
, Me , 1 , 596 , Mine , 1 , 471
,Block 4 Time,: 8264 ,
Block 5: , Mine , 1 , 1527 , Myself , 1 , 1235 , Disimproving , 0 , 2001 , Theirs , 1 , 981 , Succeeding , 1 , 1994 , Happy , 1 , 1454 , Failing , 1 , 1941 , Theirs , 1 , 1151 , Failing , 0 , 1358 , Me , 1 , 790
, Failing , 1 , 717 , Mine , 1 , 585 , Myself , 1 , 821 , Themselves , 1 , 793 , Disimproving , 1 , 965 , Succeeding , 1 , 727 , Worse , 1 , 961 , Theirs , 1 , 1259 , Mine , 1 , 578 , Better , 1 , 1112
, Mine , 1 , 1207 , Happy , 1 , 843 , Worse , 1 , 1064 , Failing , 1 , 699 , Happy , 1 , 700 , Myself , 1 , 516 , Them , 1 , 794 , Me , 1 , 526 , Sad , 1 , 1118 , Improving , 1 , 826
, Mine , 1 , 540 , Succeeding , 1 , 952 , Myself , 1 , 536 , Themselves , 1 , 851 , Improving , 1 , 865 , Mine , 1 , 582
,Block 5 Time,: 35569
보시다시피 각 블록은 여러 줄을 차지합니다. 다음 형식으로 한 줄을 차지해야 합니다.
Participant Date Time Block Word1 Correct1 Time1.....Word36 Correct36 Time36
2456 1 Happy 1 1200 sad 0 1500
.
.
.
1234 5 sad 0 1100 happy 1 900
문제는 블록 3과 5에는 36개의 자극이 있고 블록 1, 2, 4에는 12개의 자극이 있다는 것입니다. 또한 각 행에 배우, 날짜 시간 및 블록 시간이 필요합니다.
여기에 데이터를 여기에 표시된 형식으로 변환하는 스크립트가 있지만 단 한 줄에 필요한 모든 블록을 제공하지는 않습니다.
BEGIN{
FS="\\";
RS="#";
OFS=",";
ORS="\n";
}{
for(i=1;i<=NF;i++) {printf "%-10s", $i; printf ",";}
}
Ubuntu 10.04에서 gawk 버전 3.1.6을 사용하고 있습니다.
답변1
내가 올바르게 이해했다면 문제는 각 레코드에 여러 줄이 포함된 입력을 처리하는 것이며 레코드의 끝은 감지하지 못하지만 새 레코드의 시작은 다음과 같습니다. 줄이 다음으로 시작하지 않을 때마다 레코드는 다음으로 시작됩니다. 쉼표.
다음은 기록된 입력을 전처리하는 데 사용할 수 있는 awk 상용구입니다.
function process (record) {
RS = " *, *"; /*gawk allows RS to be a regexp; some implementations would require setting RS="," and manually trimming spaces*/
$0 = record; /*automatically sets $1, $2, ..., and NF*/
record = "";
/*your code goes here*/
}
{ if (/^ *,/) {record = record $0} else {process(record); record=$0} }
END { if (record != "") {process(record)} }'