2013-06-11 2 views
3

이것은 gawk 4.0.0과 함께 cygwin과 함께 Windows 7에서 실행됩니다. 이 프로그램은 내가 다음과 같습니다 일부 데이터가awk에서 기본 인쇄를 억제하는 방법은 무엇입니까?

gawk -f procjournal.gawk testdata 

처럼 호출됩니다

"Date";"Type";"Amount";"Balance" 
"6/11/2013 11:51:17 AM";"Transaction Tax";-427.5;399313884.46 
"6/11/2013 11:51:17 AM";"Market Transaction";47500;399314311.96 
"6/11/2013 11:12:42 AM";"Transaction Tax";-549.92;399266811.96 
"6/11/2013 11:12:42 AM";"Market Transaction";61101.78;399267361.88 

내가 트랜잭션에 대한 행을 추출하는 제 1 필드에서 날짜 부분을 제거하고, 시간을 포맷 할 십진수로 찍 힙니다. 나는이 AWK 프로그램을 함께 할 수 있다고 생각 :

FS=";" 
OFS=";" 
/Market Transaction/ { 
    split($1, itemdate, " "); 
    tmp = itemdate[2]; 
    split(tmp, hms, ":"); 
    timestamp = hms[3] + (hms[2] * 60) + (hms[1] * 3600); 
    if (itemdate[3] == "AM") 
     timestamp += 12 * 3600; 
    timestamp /= 3600.0; 
    $1 = timestamp; 
    print; 
} 

하지만 내 출력은 다음과 같습니다

"Date";"Type";"Amount";"Balance" 
"Date";"Type";"Amount";"Balance" 
"6/11/2013 11:51:17 AM";"Transaction Tax";-427.5;399313884.46 
"6/11/2013 11:51:17 AM";"Transaction Tax";-427.5;399313884.46 
"6/11/2013 11:51:17 AM";"Market Transaction";47500;399314311.96 
"6/11/2013 11:51:17 AM";"Market Transaction";47500;399314311.96 
11.8547;"Market Transaction";47500;399314311.96 
"6/11/2013 11:12:42 AM";"Transaction Tax";-549.92;399266811.96 
"6/11/2013 11:12:42 AM";"Transaction Tax";-549.92;399266811.96 
"6/11/2013 11:12:42 AM";"Market Transaction";61101.78;399267361.88 
"6/11/2013 11:12:42 AM";"Market Transaction";61101.78;399267361.88 
11.2117;"Market Transaction";61101.78;399267361.88 

왜 비 일치하는 선이 인쇄되고, 내가 그것을 어떻게 억제 하는가?

+0

을 ";" 액션 블록 바깥에 있기 때문에 조건이됩니다. 따라서이 레코드는 true로 평가되고 현재 레코드를 인쇄하는 기본 동작을 호출합니다. OFS에 대한 Ditto = ";". 이 문제를 해결하는 방법에 대한 @ Jaypal의 답변을 참조하십시오. 둘 다 동일한 값을 원할 때 간결성을 위해'FS = OFS = ";"'를 사용하는 것도 좋은 생각입니다. –

답변

6

블록을 BEGIN 블록에 구분 기호가 포함되도록 변경하십시오.

스크립트 내용 :

BEGIN { 
FS=";" 
OFS=";" 
} 
/Market Transaction/ { 
    split($1, itemdate, " "); 
    tmp = itemdate[2]; 
    split(tmp, hms, ":"); 
    timestamp = hms[3] + (hms[2] * 60) + (hms[1] * 3600); 
    if (itemdate[3] == "AM") 
     timestamp += 12 * 3600; 
    timestamp /= 3600.0; 
    $1 = timestamp; 
    print; 
} 
+0

이것이 그럴 것이라고 생각하지 마십시오. 프로그램은'gawk -f'로 호출 된 파일에 저장됩니다. 당신의 제안을 시도했을 때 나는'줄에 마지막 글자가 아닌 백 슬래시 '를 가지고있다. – wades

+1

큰 문제는 OP가 각 줄의 입출력 필드 구분 기호를 변경하고 매우 이상하고 나쁜 것을 수행한다는 것입니다. 그것들을'BEGIN' 블록에 넣고 마술처럼 모든 것이 작동합니다, 그렇지 않으면 그렇게되기를 바랍니다. 그 백 슬래시는 나에게 의미가 없습니다. Linux에서도 같은 오류가 발생합니다. – Birei

+0

아아, 이제는 의미있는 질문을 업데이트했습니다. 'BEGIN' 블록에'FS'와'OFS'를 포함하면됩니다. 그렇게하면 두 줄의 출력을 얻어야합니다. –

0

하지 질문에 대한 답변하지만, 시간 계산하는 다른 방법 : 당신은 FS =이

if (match($1, /([0-9]?[0-9]):([0-9][0-9]):([0-9][0-9]) ([AP]M)/, a)) { 
    $1 = a[1] + (a[2]*60 + a[3])/3600 + (a[4] == "PM" ? 12 : 0) 
} 
관련 문제