首页 > 解决方案 > 删除符合特定条件的行

问题描述

有多个输入文件(例如:file1、file2、file3 ....)每个文件包含如下几行。

文件 1:

123,WoW,45,2018,M_SILVER    
124,WoW_HD,2018,M_SILVER    
125,WoW,45,2018,M_SILVER_FTTH    
126,WoW,45,2018,M_GOLD

文件 2:

133,WoW,45,2019,M_SILVER    
134,WoW_HD,2019,M_SILVER    
135,WoW,45,2019,M_SILVER_FTTH    
136,WoW,45,2019,M_GOLD 

我需要删除包含 WoW 和(M_SILVER 或 M_GOLD)输出的行应该只包含如下行。

文件 1:

124,WoW_HD,2018,M_SILVER    
125,WoW,45,2018,M_SILVER_FTTH 

文件 2:

134,WoW_HD,2019,M_SILVER    
135,WoW,45,2019,M_SILVER_FTTH 

文件名不能更改。希望现在问题很清楚,你们可以提供解决方案。

尝试如下:

ls | grep file| sort | while read line ; do cat $line | grep WoW |grep -v WoW_HD | grep 'M_SILVER\|M_GOLD' | sed -i '/$line/d' ./infile;done

标签: linuxawksedgrep

解决方案


猜猜你想要这样的东西:

$ awk -F, '!($2=="WoW" && ($5~"^M_(SILVER|GOLD) *$"))' file1
124,WoW_HD,2018,M_SILVER
125,WoW,45,2018,M_SILVER_FTTH

$ awk -F, '!($2=="WoW" && ($5~"^M_(SILVER|GOLD) *$"))' file2
134,WoW_HD,2019,M_SILVER
135,WoW,45,2019,M_SILVER_FTTH

如果您有 GNU awk 4.1.0+,您可以添加-i inplace开关以替换文件。将/
更改为或其他以匹配多个文件。 或者像你以前做的那样,喂到和管道到.file1file2file*
lsxargsawk


推荐阅读