2015-04-02 81 views
1

是否可以使用awk從文件中刪除行?我想找到最後一列中有Y的行,然後刪除與該行第2列中的值相匹配的行。使用AWK刪除特定行[或sed,grep,whatever]

前:

KEY1,TRACKINGKEY1,TRACKINGNUMBER1-1,PACKAGENUM1-1,N 
    ,TRACKINGKEY1,TRACKINGNUMBER1-2,PACKAGENUM1-2,N 
KEY1,TRACKINGKEY1,TRACKINGNUMBER1-1,PACKAGENUM1-1,Y 
    ,TRACKINGKEY1,TRACKINGNUMBER1-2,PACKAGENUM1-2,Y 
KEY1,TRACKINGKEY5,TRACKINGNUMBER1-3,PACKAGENUM1-3,N 
KEY2,TRACKINGKEY2,TRACKINGNUMBER2-1,PACKAGENUM2-1,N 
KEY3,TRACKINGKEY3,TRACKINGNUMBER3-1,PACKAGENUM3-1,N 
    ,TRACKINGKEY3,TRACKINGNUMBER3-2,PACKAGENUM3-2,N 

所以AWK會發現該行有3中的Y最後一列,然後再看列2 TRACKINGKEY1]和刪除具有TRACKINGKEY1在列中的所有行2.

預期結果:

KEY1,TRACKINGKEY5,TRACKINGNUMBER1-3,PACKAGENUM1-3,N 
KEY2,TRACKINGKEY2,TRACKINGNUMBER2-1,PACKAGENUM2-1,N 
KEY3,TRACKINGKEY3,TRACKINGNUMBER3-1,PACKAGENUM3-1,N 
    ,TRACKINGKEY3,TRACKINGNUMBER3-2,PACKAGENUM3-2,N 

這樣做的原因是,我們的船ping程序會在處理貨件時發出文件,以及何時該貨件無效[出現錯誤時]。所以我最終得到的是最初的包裹信息,然後是表明它已經無效的相同信息,然後是另一組包含新貨件信息的行。不幸的是,我們的ERP軟件有一個相當簡單的腳本語言,我甚至無法制作數組,因此我僅限於shell工具。

在此先感謝!

回答

1

的一種方法是使用awk來取2個傳遞給同一個文件:

awk -F, 'NR == FNR && $NF=="Y" && !($2 in seen){seen[$2]} 
      NR != FNR && !($2 in seen)' file file 
KEY1,TRACKINGKEY5,TRACKINGNUMBER1-3,PACKAGENUM1-3,N 
KEY2,TRACKINGKEY2,TRACKINGNUMBER2-1,PACKAGENUM2-1,N 
KEY3,TRACKINGKEY3,TRACKINGNUMBER3-1,PACKAGENUM3-1,N 
    ,TRACKINGKEY3,TRACKINGNUMBER3-2,PACKAGENUM3-2,N 

說明:

NR == FNR     # if processing the file 1st time 
&& $NF=="Y"     # and last field is Y 
&& !($2 in seen) {   # we haven't seen field 2 before 
    seen[$2]}     # store field 2 in array seen 
} 
NR != FNR     # when processing the file 2nd time 
&& !($2 in seen)    # array seen doesn't have field 2 
          # take default action and print the line 
+1

當NR == FNR時,如果我們之前沒有看過它,沒關係。不錯的解決方案。 – 2015-04-02 20:44:09

1

該解決方案是一種嚴重的,但一種樂趣。

grep ',Y$' file | cut -d, -f2 | sort -u | grep -vwFf - file 
  • grep ',Y$' file - 找到Y上的線最後一列
  • cut -d, -f2 - 打印剛剛從這些行
  • 跟蹤密鑰
  • sort -u - 僅僅給出了獨特的按鍵
  • grep -vwFf - file -
    • 從標準輸入讀取唯一的跟蹤鍵(-f -
    • 只考慮他們的比賽,如果他們是整個單詞(-w
    • 它們是固定的字符串,而不是正則表達式(-F
    • 然後排除行從文件中匹配這些模式(-v