Shell-Script

搜尋一列的值並從文件的其他列檢索連接的值

  • December 8, 2020

我有一個包含 4 列的文本文件,數據如下所示:

P_ID         C_ID         Code         MSG
10            12          001         abcd
20            21          003         jklm
10            12          002         hijk

這裡 P_ID、C_ID、Code 和 MSG 是列。

需要對列 C_ID 進行搜尋,如果相同 C_ID 值有多個條目但具有不同的 code 和 MSG 列值,則最終文件應具有如下預期輸出文件所示的結果,其中 code 和 msg 列值是用逗號連接在一行中。

預期的輸出應該是這樣的:

P_ID          C_ID         Code          MSG
10             12         001,002        abcd,hijk
20             21         003            jklm

以下是輸出:

1: NF=4
  $1=[P_ID]
  $2=[C_ID]
  $3=[Code]
  $4=[MSG]
2: NF=4
  $1=[10]
  $2=[12]
  $3=[001]
  $4=[abcd]
3: NF=4
  $1=[20]
  $2=[21]
  $3=[003]
  $4=[jklm]
4: NF=4
  $1=[10]
  $2=[12]
  $3=[002]
  $4=[hijk]

第一個答案中提供的解決方案的輸出是:

P_ID    C_ID    Code    MSG
10      12      001     abcd
20             21         003            jklm
10             12         002            hijk

用於檢查列名和相應數據的 awk 命令工作正常,但是作為答案提供的第一個命令沒有給出預期的結果。

當問題得到澄清時,這可能需要細化,但是,基於其目前狀態,

awk '
   BEGIN   { unique_vals = 0 }
   NR == 1 { print }
   NR > 1  {
               if (seen[$2] == "") {
                       i = seen[$2] = unique_vals++
                       P_ID[i] = $1
                       C_ID[i] = $2
                       Code[i] = $3
                       MSG[i]  = $4
               } else {
                       i = seen[$2]
                       Code[i] = Code[i] "," $3
                       MSG[i]  = MSG[i]  "," $4
               }
           }
   END     {
               for (i=0; i<unique_vals; i++) {
                       printf "%-15s%-11s%-15s%s\n", P_ID[i], C_ID[i], Code[i], MSG[i]
               }
           }
   ' file

似乎完成了這項工作。


好的,我假設您知道如何執行awk. 如果你不這樣做,就這麼說。如果這樣做,請執行此調試腳本:

awk '
   {
       print NR ": NF=" NF
       print "   $1=[" $1 "]"
       print "   $2=[" $2 "]"
       print "   $3=[" $3 "]"
       print "   $4=[" $4 "]"
   }
   ' file

在您的輸入文件上並在您的問題中發布輸出。(請使用`````“程式碼圍欄”。)然後在這裡發表另一條評論,讓我知道你已經這樣做了。

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