簡體   English   中英

使用 awk 打印匹配鍵的列范圍

[英]Using awk to print range of columns for matching keys

這似乎有一個簡單的解決方案,但我被卡住了。 我想在密鑰文件中查找主文件的第二列,對於任何匹配的密鑰,只打印前兩列,但打印 rest 的整個記錄。我有一個工作腳本,但打印整行對於匹配的鍵。 你能幫忙嗎?

awk 'FNR == NR {key[$1]; next} $2 in key {print $1,$2}' keyfile mainfile > outfile

主文件:

PSHELL      10  136514    0.7                
PSHELL      15  136514    0.7                
PSHELL      20  136513    2.0                  
PSHELL      30  13571     1.7 

密鑰文件:

10
30

輸出文件:

PSHELL      10                
PSHELL      15  136514    0.7                
PSHELL      20  136513    2.0                  
PSHELL      30

您可以使用此awk

awk 'FNR == NR {key[$1]; next} {print ($2 in key ? $1 OFS $2 : $0)}' keyfile mainfile | column -t > outfile

cat outfile

PSHELL  10
PSHELL  15  136514  0.7
PSHELL  20  136513  2.0
PSHELL  30

這里:

  • 當我們在key數組中找到$2 2 時,使用三元運算打印$1 OFS $2否則我們打印$0
  • 用於表格輸出的column -t

嘗試這個:

awk 'FNR == NR {key[$1]; next} $2 in key {print $1,$2;next} 1' keyfile mainfile

最后一個1表示一個空塊,其默認行為是打印整行。
並與前面塊中的next結合,充當一種if else開關。

這是執行相同操作的另一種方法。 假設您不關心 output 行的順序,那么以下內容也可能對您有所幫助。

awk '
FNR==NR{
  arr1[$2]=$1 OFS $2
  arr2[$2]=$0
  next
}
($1 in arr1){
  print arr1[$1]
  arr3[$1]
}
END{
  for(key in arr2){
    if(!(key in arr3)){
      print arr2[key]
    }
  }
}
' mainfile keyfile

暫無
暫無

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

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