有多个输入文件(例如: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 是不需要的(并且无用的)。