Bash

使用 awk 檢查一個變數中特定列上每一行中的數字與另一個變數中兩個特定列中的所有行

  • May 11, 2022

我需要檢查一個變數中特定列的每一行中的數字與另一個變數中兩個特定列中的所有行的對比awk,並在第一個變數中保留滿足參數的行。

到目前為止,我嘗試通過一個強大的awk命令來執行此操作都失敗了。我顯然可以在外部循環中執行此操作,但它會非常慢,因為我有 100 條數千行要檢查。我感謝解決這個問題的任何和所有幫助,我一直在尋求改進我對 awk 的使用,所以如果你有一個解決方案,最好有一個解釋,這樣我就可以學習和提高自己。

這是一個例子:

  • 假設我只想列印第 2 列中的行${ListToCheckFrom},如果數字有 > 第 2 列和 < 第 3 列中的任何行${ListToCheckAgainst}
  • 輸入範例:
ListToCheckFrom="C,2  
C,22  
C,12  
hr,15"

ListToCheckAgainst="C1,25,50  
hr1,22,30  
r,12,18  
C,15,44"  
  • 預期輸出:
C,22  
hr,15

由於您已用 標記問題bash,因此您可以使用程序替換來讀取 shell 變數,如輸入文件。以下腳本片段應該這樣做:

#!/bin/bash

ListToCheckFrom="C,2  
C,22  
C,12  
hr,15"

ListToCheckAgainst="C1,25,50  
hr1,22,30  
r,12,18  
C,15,44"

awk -F',' 'list=="constr"{n++; low[n]=$2;high[n]=$3;next}
          {for (i=1;i&lt;=n;i++) {if ($2&gt;low[i]&&$2&lt;high[i]) {print;next};}}' \
          list=constr &lt;(echo "$ListToCheckAgainst") \
          list=chk &lt;(echo "$ListToCheckFrom")

這將指定作為第一個輸入文件的’d 內容,以及echo作為第二個輸入文件的 ’d 內容。它將在“打開”每個文件之前或之前設置一個變數,以便在內部區分目前正在處理哪些“文件”。$ListToCheckAgainst``echo``$ListToCheckFrom``awk``list``constr``chk``awk

  • 當處理來自 的“約束”時$ListToCheckAgainst,它只是將第 2 列和第 3 列中指定的“下”和“上”界限分別儲存在數組lowhigh中。除此之外,它會立即跳過處理到下一個輸入行。
  • 在處理要檢查的列表時$ListToCheckFrom,它會掃描之前註冊的所有範圍,如果發現第 2 列在其中任何一個範圍內,則列印它(並立即跳過處理到下一個輸入行)。

如果您的數據儲存在“物理”文件而不是 shell 變數中,您可以簡單地使用文件名而不是程序替換作為命令行參數。

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