簡體   English   中英

使用AWK刪除特定行[或sed,grep等

[英]Delete Specific Lines with AWK [or sed, grep, whatever]

可以使用awk從文件中刪除行嗎? 我想找到在最后一列中具有Y的任何行,然后刪除與該行的第2列中的值匹配的任何行。

之前:

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會發現第三行的最后一列具有Y,然后查看第二列[TRACKINGKEY1],並刪除第二列中所有具有TRACKINGKEY1的行。

預期結果:

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

這樣做的原因是,無論何時處理貨件,以及當貨件作廢時(如果發生錯誤),我們的運輸程序都會輸出文件。 因此,我最終得到的是初始包裹信息,然后是指示其已失效的相同信息,然后是另外一組帶有新裝運信息的行。 不幸的是,我們的ERP軟件具有相當簡單的腳本語言,我什至無法創建數組,因此僅限於shell工具。

提前致謝!

一種方法是使用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

該解決方案有點麻煩,但很有趣。

grep ',Y$' file | cut -d, -f2 | sort -u | grep -vwFf - file
  • grep ',Y$' file -在最后一列中找到帶有Y的行
  • cut -d, -f2僅從這些行中打印跟蹤鍵
  • sort -u -僅給出唯一鍵
  • grep -vwFf - file -
    • 從stdin( -f - )讀取唯一的跟蹤鍵
    • 如果它們是整個單詞( -w ),則僅將其視為匹配項
    • 它們是固定字符串,而不是正則表達式( -F
    • 然后從文件中排除與這些模式( -v )匹配的行

暫無
暫無

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

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