[英]How to perform "greater than" with sed or awk to delete specific lines?
[英]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
-
-f -
)讀取唯一的跟蹤鍵 -w
),則僅將其視為匹配項 -F
) -v
)匹配的行
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.