Удалить строки, которые обрабатывают определенные критерии - PullRequest
0 голосов
/ 28 января 2019

Существует несколько входных файлов (например, file1, file2, file3 ....), каждый файл содержит несколько строк, как показано ниже.

file 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

file 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

Ответы [ 2 ]

0 голосов
/ 28 января 2019

обычно достаточно 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 напрямую.используя его для отслеживания файла, используйте его в цикле for, где файл создается непосредственно для File in file *;do ...; done

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

grep может делать все это в одной строке (с вашим форматом данных).grep -v ', Wow,. *, (M_SILVER \ | M_GOLD)' $ File> NewFile

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

это запросит sed для "выбора строки с шаблоном, имеющим слово line послеконец строки и удалить его, остальные неизменны »из файла и изменяя его ./infile.Вы копируете / вставляете часть кода в sed, не понимая, что делаете, и не читаете об этом, немного опасно.Эта часть кода не нужна (и бесполезна) для цели, уже сделанной до этой части строки.

0 голосов
/ 28 января 2019

Думаю, вы хотите что-то вроде этого:

$ 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...