删除处理某些条件的行



有多个输入文件(例如: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

猜你想要这样的东西:

$ 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开关来替换文件。
file1/file2更改为file*或其他以匹配多个文件。
或者像你以前做的那样,ls并喂给xargs,用管道喂awk.

正常情况下,sed 或 grep 就足够

sed -i -e '/,Wow,.*,M_SILVER$/d;/,Wow,.*,M_GOLD$/d' file[1-9]*

评论您的行:

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

ls | grep file| sort | while read line ; do cat $line ... ;done

这里不需要这个,ls *file*就够了,你不需要排序,直接使用 ls 的可能性。 使用它来 cat 文件,在 for 循环中使用它,直接制作文件 对于文件中的文件*;做。。。;做

cat $line | grep WoW |grep -v WoW_HD | grep 'M_SILVER|M_GOLD' |

grep 可以在一行中完成所有这些操作(使用您的数据格式)。 grep -v ',Wow,.*,(M_SILVER\|M_GOLD)' $File> 新文件

| sed -i '/$line/d' ./infile

这将要求 sed 从 ./infile 中"选择具有line行末尾单词的模式的行并删除它,其他保持不变"。 您在 SED 上复制/粘贴部分代码而不了解您的工作或阅读它,有点危险。这部分代码对于在行的这一部分之前已经完成的 prupose 是不需要的(并且无用的)。

最新更新