2015-01-01 5 views
0

다음 행은 한 행에 있습니다.Solaris에서 sed 또는 awk 명령을 사용하여 행을 구분해야합니다.

2014-12-30 00:00:02,317 pool-14076-thread-3 DEBUG [com.fundamo.connector.airtime.service.AirtimeService] ERS Response XML - <soap:Envelope><soap:Body><TopUpPhoneAccountResult><MessageID>1913351092</MessageID><MessageRefID>BD9123000000003</MessageRefID><TopUpPhoneAccountStatus><StatusID>200</StatusID><Comment>Transaction Successful</Comment></TopUpPhoneAccountStatus><TopUpPhoneAccountAmountSent><Amount>2000</Amount><AmountExcludingTax>2000</AmountExcludingTax><TaxName/><TaxAmount>0</TaxAmount><PhoneNumber>1766910910</PhoneNumber><ResponseDateTime>20141230000002320</ResponseDateTime><ServiceType>PRETOP</ServiceType><CurrencyCode>TK</CurrencyCode></TopUpPhoneAccountAmountSent></TopUpPhoneAccountResult></soap:Body></soap:Envelope> 

이제는 몇 가지 값을 사용하고 싶습니다. 나는이 명령을 사용 :

cat ERS_RESPONSE_30Dec_atp11.txt |awk -F'<' '{print $1 "," $5 "," $7 "," $10 ","$12"," $16 "," $23}' 

출력 :

2014-12-30 00:00:02,317 pool-14076-thread-3 DEBUG [com.fundamo.connector.airtime.service.AirtimeService] ERS Response XML - ,MessageID>1913351092,MessageRefID>BD9123000000003,StatusID>200,Comment>Transaction Successful,Amount>2000,PhoneNumber>1766910910 

그러나, 나는 필드 만이 다음과 같이합니다.

2014-12-30 00:00:02,317 ,1913351092,BD9123000000003,200,Transaction Successful,2000,1766910910 

어떻게해야합니까? 여기

+0

@ nu11p01n73R 데이터가 한 줄에있는 경우 게시물을 편집 할 때 한 줄에 있어야합니다. 하나의 긴 줄에서 4 줄을 만들었습니다. – Jotne

+0

@Basudev 당신은'2000'에 대한 두 개의 항목이 있습니다. 그 중 하나는 출력을 원하십니까? ' 2000'. ''값? 또는 ''? –

+0

내 데이터가 한 줄 ..... – Basudev

답변

2

awk

awk -F"[ <>]" '{print $1" "$2,$18,$22,$28,$32" "$33,$41,$55}' OFS=, ERS_RESPONSE_30Dec_atp11.txt 
2014-12-30 00:00:02,317,1913351092,BD9123000000003,200,Transaction Successful,2000,1766910910 

와 함께 할 그리고 여기에 몇 가지 팁입니다하는 방법입니다. 그럼 그냥 모두의를 넣어 awk -F"[ <>]" '{for (i=1;i<=NF;i++) print i"="$i}' file

  • : 모든 필드를 구분 손쉽게 찾을 수

    1. 시도, 그녀는이 같은 실행을하여 , <
    2. > 그런 다음 모든 필드를 찾을 것 함께.
  • +0

    내 서버에서 작동하지 않습니다. ... 내 서버는 아래와 같습니다. SunOS ftpsvr 5.10 Generic_150401-09 i86pc i386 i86pc 나는 거의 모든 가치를 얻고 있습니다. – Basudev

    +0

    @Basudev 무엇이 작동하지 않습니다. 오류가 발생합니까, 잘못된 결과가 나옵니까? 이 awk은 특별한 기능을 사용하지 않으므로 대부분의 시스템에서 작동해야합니다. – Jotne

    +0

    아래 명령을 실행합니다 .... 고양이 ERS_RESPONSE_30Dec_atp11.txt | awk -F "[<]" "{인쇄 $ 1, $ 2, $ 18, $ 22, $ 28, $ 32" ""$ 33, $ 41, $ 55} 'OFS = 괜찮습니까? – Basudev

    0

    다음과 같이

    sed 's#\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\},\S*\).*<MessageID>\([[:digit:]]\{1,\}\)<.*<MessageRefID>\([[:alpha:]]\{1,\}[[:digit:]]\{1,\}\).*<StatusID>\([[:digit:]]\{1,\}\).*\(Transaction Successful\).*<Amount>\([[:digit:]]\{1,\}\).*<PhoneNumber>\([[:digit:]]\{1,\}\).*#\1 ,\2,\3,\4,\5,\6,\7#g' 
    

    이 일단 만들어 다시 원본 파일의 최대 실제 변경을 sed -i.baksed을 대체 파일 다음에 (이 조금 긴) 나오지도 시도 할 수 있습니다 작품 (내 측면에서 테스트 한 명령 줄)

    0

    awk 대신 Solaris에서 nawk을 사용해야합니다. Solaris의 버전 awk에서는 매개 변수가 단일 문자 만 사용할 수 있으며 nawk에서는 정규 표현식을 사용할 수 있습니다.

    $ nawk -F'<[^<]+>' '{print $1 "," $5 "," $7 "," $10 ","$12"," $16 "," $23}' ERS_RESPONSE_30Dec_atp11.txt 
    

    솔라리스

    에 다음과 같은 시도

    $ awk -F'<[^<]+>' '{print $1 "," $5 "," $7 "," $10 ","$12"," $16 "," $23}' ERS_RESPONSE_30Dec_atp11.txt 
    

    :이 맥에서 작동

    :

    당신은 대신 <의 구분 기호로 <.....>의 전체 패턴을 지정해야 작동하지 않으면 ...

    $ nawk -F'<[^<][^<]*>' '{print $1 "," $5 "," $7 "," $10 ","$12"," $16 "," $23}' ERS_RESPONSE_30Dec_atp11.txt 
    
    관련 문제