2013-09-28 2 views
1

У меня есть список поставщиков MAC, и мне нужно проанализировать текст, чтобы удалить информацию, которая не требуется.Удалить конкретные слова + символ в Bash

Если у меня есть эта

F8FEA8 Technico # Technico Japan Corporation 
F8FF5F Shenzhen # Shenzhen Communication Technology Co.,Ltd 
FC0012 ToshibaS # Toshiba Samsung Storage Technolgoy Korea Corporation 
FC019E Vievu 
FC01CD Fundacio # FUNDACION TEKNIKER 
FC0647 Cortland # Cortland Research, LLC 
FC0877 PrentkeR 
FC0A81 Motorola # Motorola Solutions Inc. 

Мне нужно удалить все [пробел] [слово] [#], чтобы это

F8FEA8 Technico Japan Corporation 
F8FF5F Shenzhen Communication Technology Co.,Ltd 
FC0012 Toshiba Samsung Storage Technolgoy Korea Corporation 
FC019E Vievu 
FC01CD FUNDACION TEKNIKER 
FC0647 Cortland Research, LLC 
FC0877 PrentkeR 
FC0A81 Motorola Solutions Inc. 

Это может быть сделано с Grep или sed? : S

Извините за мой плохой английский

ответ

2

Подробнее awk

awk -F" # [^ ]+ " '{$1=$1}1' file # more robust 
awk -F" # [^ ]+ " '$1=$1' file # some dangerous, do not use if $1=0 

Устанавливает разделитель поля, равный тому, что мы хотели бы удалить и затем распечатать остальные.

awk '{sub(/ # [^ ]+/,x)}1' file 

Это просто удаляет то, что мы не хотим.

2

Это кажется простой синтаксический. Здесь используется решение с использованием . Он разбивает строку в полях, расположенных в белых пространствах, и если третий один # удалить его и предыдущая:

perl -lane 'if ($F[2] eq q|#|) { @F = @F[0,3..$#F] }; print qq|@F|' infile 

Это дает:

F8FEA8 Technico Japan Corporation 
F8FF5F Shenzhen Communication Technology Co.,Ltd 
FC0012 Toshiba Samsung Storage Technolgoy Korea Corporation 
FC019E Vievu 
FC01CD FUNDACION TEKNIKER 
FC0647 Cortland Research, LLC 
FC0877 PrentkeR 
FC0A81 Motorola Solutions Inc. 
2

Предполагая # стенды сам по себе в области 3, когда его происходит следующее решение может работать

awk '$3 == "#"{t=$1; $1=$2=$3=""; sub(/^[[:space:]]+/, ""); $0=t" "$0}; 
    {print}' file.txt 
4

Вот оболочка единственное решение:

while read A B C D;do 
    [ "$C" == "#" ] && echo "$A $D" || echo "$A $B $C $D" 
done <infile.txt>outfile.txt 
4

Это может работать для вас (GNU СЭД):

sed -ri 's/\s\S+\s#//' file 

или:

sed -i 's/ [^ ][^ ]* #//' file 

Что означает: Посмотрите на пространство за которым следует один или более не-пространства, а затем другое место, за которым следует #, а затем удалите это выражение. Файл обновляется на месте, что означает опция -i. Опция -r в первом решении позволяет использовать syntatic sugar, в этом случае вы можете написать \S+ вместо \S\+ или [^ ][^ ]*.

+0

Любой шанс, что это может быть привязано таким образом, что он будет запускаться только тогда, когда '#' находится в третьем поле? – iruvar

+0

+1 в любом случае. – iruvar

+0

Спасибо @ 1_CR за третье поле, может быть: 'sed -r '/^(\ S + \ s) {2} #/s/\ s \ S + \ s # //' файл'? – potong

Смежные вопросы