Text-Processing

查找 Occurrence,然後從第一個結果中的段中查找下一個 Occurrence

  • November 5, 2019

我正在尋求一點幫助,我正在學習。我有類似於下面的內容。我希望在 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 Inor匹配,則列印整行Processed Bill

引用自:https://unix.stackexchange.com/questions/550350