현재 통화(tag55)와 가격(tag133)을 표시하는 2개의 열을 가져오기 위해 FIX 메시지를 구문 분석하려고 하는데 메시지의 필수 부분이 열로 분리되지 않은 것 같기 때문에 "awk"를 사용하는 데 어려움이 있습니다. (굵은 글씨로 표시) 참고용입니다. 이를 달성하는 방법에 대한 아이디어가 있습니까?
FIX log example:
03:55:16.128 incoming 20180528-07:55:16.015 8587130 11891 8587030 S **8=FIX.4.29=013535=S49=IUAT2Feed56=FixServer50=IUAT2Feed_Offers34=858713052=20180528-07:55:16.015117=055=NOK/SEK7225=7133=1.0735135=2100000010=159**
03:55:16.128 incoming 20180528-07:55:16.015 8587131 11891 8587030 S **8=FIX.4.29=013435=S49=IUAT2Feed56=FixServer50=IUAT2Feed_Offers34=858713152=20180528-07:55:16.015117=055=USD/CNH7225=2133=6.3872135=300000010=110**
원하는 출력:
NOK/SEK 1.0735
USD/CNH 6.3872
답변1
perl -F= -pale '$_ = sprintf "%.7s %.4f", @F[-5,-3]' fix.log
¶ 작동 방식:
° split each line as it comes on equal to sign. Store the split values in the array @F
° counting from the end of the array @F, the last but 4th and last but 2nd fields are what we need.
° we require the 7 chars and accuracy upto 4 digits.
° stuff these in $_ and -p option auto prints it.
답변2
다음 내용이 awk
도움이 될 수 있습니다.
awk -F"=" '{sub(/[0-9]+/,"",$(NF-4));print $(NF-4),$(NF-2)+0}' OFMT="%.05g" Input_file
답변3
awk를 사용하면 다음과 같이 할 수 있습니다.
$ awk -F= '{for (i=1;i<=NF;i++) if($i ~ "NOK" || $i ~ "USD"){print $i,$(i+2)}}' input_file | awk '{gsub(/[0-9]/,"",$1)}1'
NOK/SEK 1.0735135
USD/CNH 6.3872135