Text-Processing
查找 Occurrence,然後從第一個結果中的段中查找下一個 Occurrence
我正在尋求一點幫助,我正在學習。我有類似於下面的內容。我希望在 Log1 上顯示**“登錄”的出現,然後在 Log1 上顯示“已處理的賬單”**。使用 - 44 的搜尋值。老實說,這看起來像是我試圖作弊測試或其他東西,但事實並非如此,我是分解文件的新手,並希望學習。
文件.txt
Log0 | 20191104 | 01 | Logged In - 55 Log1 | 20191104 | 04 | Logged In - 44 Log2 | 20191104 | 03 | Logged In - 33 Log1 | 20191104 | 02 | Received Bill Log1 | 20191104 | 02 | Accepted Bill Log2 | 20191104 | 05 | Logged Out - 33 Log1 | 20191104 | 33 | Processed Bill Log0 | 20191104 | 44 | Broken Bill
尋找所需的輸出。
Log1 | 20191104 | 04 | Logged In - 44 Log1 | 20191104 | 33 | Processed Bill
實際上與@Choroba 解決方案非常相似:
awk -F'|' '/Logged In/ { login[$1]=$0} /Processed Bill/ && login[$1] { print login[$1]; print}' ex1
在哪裡:
/Logged In/ { login[$1]=$0}
– 保存與第 1 列關聯的“登錄”行(例如“Log1”)/Processed Bil/ && login[$1] {print ...}
– 在找到之前登錄的“已處理賬單”時列印更正:僅列印 44:
awk -F'|' '/Logged In - 44/ { cod=$1; line=$0} /Processed Bill/ && $1==cod { print line "\n" $0}' file
Perl 解決方案:
perl -F'/\|/' -ne '$id = $F[0] if $F[3] =~ /- 44$/; print if $F[0] eq $id && $F[3] =~ /Logged In|Processed Bill/; ' -- file.txt
-n
逐行讀取輸入-F
將給定正則表達式上的每個輸入行拆分為@F
數組- 如果
$F[3]
,即第四列與 匹配- 44
,則第一列儲存在 中$id
。$id
如果第一列等於且第四列與Logged In
or匹配,則列印整行Processed Bill
。