簡體   English   中英

awk:如何從一行中提取 2 個模式,然后將它們連接起來?

[英]awk: how to extract 2 patterns from a single line and then concatenate them?

我想在每行中找到 2 個模式,然后在它們之間用破折號作為分隔符打印它們。 以下是行的示例:

20200323: #5357 BEAR_SPX_X15_NORDNET_D1 {CU=DKK, ES=E, II=DK0061205473, IR=NRB, LN=BEAR SPX X15 NORDNET D1, MIC=FNDK, NS=1, PC=C, SE=193133, SG=250, SN=193133, TK="0.01 to 100,0.05 to 500,0.1", TS=BEAR_SPX_X15_NORDNET_D1, TY=W, UQ=1}
20200323: #5358 BULL_SPX_X10_NORDNET_D2 {CU=DKK, ES=E, II=DK0061205556, IR=NRB, LN=BULL SPX X10 NORDNET D2, MIC=FNDK, NS=1, PC=P, SE=193132, SG=250, SN=193132, TK="0.01 to 100,0.05 to 500,0.1", TS=BULL_SPX_X10_NORDNET_D2, TY=W, UQ=1}
20200323: #5359 BULL_SPX_X12_NORDNET_D2 {CU=DKK, ES=E, II=DK0061205630, IR=NRB, LN=BULL SPX X12 NORDNET D2, MIC=FNDK, NS=1, PC=P, SE=193131, SG=250, SN=193131, TK="0.01 to 100,0.05 to 500,0.1", TS=BULL_SPX_X12_NORDNET_D2, TY=W, UQ=1}

鑒於以上幾行,我運行腳本后所需的輸出應如下所示:

BEAR_SPX_X15_NORDNET_D1 - DK0061205473
BULL_SPX_X10_NORDNET_D2 - DK0061205556
BULL_SPX_X12_NORDNET_D2 - DK0061205630

第一個字母數字值(例如 BULL_SPX_X12_NORDNET_D2)始終位於行的第三個位置。 第二個字母數字值(例如 DK0061205630)可以在不同的位置,但它總是以“II=”開頭,並且總是正好是 12 個字符的長度。

我嘗試使用以下腳本來實現我的任務:

 13 regex='II=.\{12\}'
 14 while IFS="" read -r line; do
 15     matchedString=`grep -o $regex littletest.txt | tr -d 'II=,'`
 16     awk /II=/'{print $3, " - ", $matchedString}' littletest.txt > temp.txt
 17 done <littletest.txt

我的思考過程和意圖/假設:

第 13 行定義了一個正則表達式模式來匹配以“II=”開頭的字母數字字符串

在第 15 行變量“matchedString”被分配了一個值,該值是通過正則表達式從一行中提取的,前面的“II=”被刪除。

第 16 行使用 awk 表達式來檢測所有包含“II=”的行,然后打印在每個輸入文件的行中找到的第三個字符串,並打印在腳本的前一行中定義的匹配字符串模式的值。 所以我希望此時應該將一對提取的模式(例如 BEAR_SPX_X15_NORDNET_D1 - DK0061205473)傳輸到 temp.txt 文件。

第 17 行獲取輸入文件以供腳本使用。

但是,運行腳本后,我沒有得到所需的輸出。 這是我得到的樣本:

BEAR_SPX_X15_NORDNET_D1
20200323: #5357 BEAR_SPX_X15_NORDNET_D1 {CU=DKK, ES=E, II=DK0061205473, IR=NRB, LN=BEAR SPX X15 NORDNET D1, MIC=FNDK, NS=1, PC=C, SE=193133, SG=250, SN=193133, TK="0.01 to 100,0.05 to 500,0.1", TS=BEAR_SPX_X15_NORDNET_D1, TY=W, UQ=1}

我怎樣才能達到我之前描述的想要的輸出?

$ awk -v OFS=' - ' 'match($0,/II=/){print $3, substr($0,RSTART+3,12)}' file
BEAR_SPX_X15_NORDNET_D1 - DK0061205473
BULL_SPX_X10_NORDNET_D2 - DK0061205556
BULL_SPX_X12_NORDNET_D2 - DK0061205630

只是在嘗試 awk。

awk  'BEGIN{ FS="[II=, ]+" ; OFS=" - " } {print $3, $8}' file.txt

使用支持正則表達式的gawk (gnu awk) 作為字段分隔符 (FS) ,並考慮到文件中的每一行都具有完全相同的格式/相同數量的字段,這在我的測試中工作正常:

awk '{print $3,$9}' FS="[ ]|II=" OFS=" - " file1
#or FS="[[:space:]]+|II=|[,]" if you might have more than one space between fields

結果

BEAR_SPX_X15_NORDNET_D1 - DK0061205473
BULL_SPX_X10_NORDNET_D2 - DK0061205556
BULL_SPX_X12_NORDNET_D2 - DK0061205630

由於II=部分可以在任何地方,這個技巧也可以與解析文件兩次的懲罰一起使用:

paste -d "-" <(awk '{print $3}' file1) <(awk '/II/{print $2}' RS="[ ]" FS="=|," file1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM