2013-09-28 79 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):

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

或:

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

這意味着:尋找一個空格,然後通過一個或多個非空間,其次是另一個空格,然後是#,然後刪除該表達式。該文件正在更新,這是-i選項意味着什麼。第一個解決方案中的-r選項允許使用syntatic sugar,在這種情況下允許您編寫\S+而不是\S\+[^ ][^ ]*

+0

這個可以錨定的任何機會,只有在##在第三個字段時纔會啓動? – iruvar

+0

無論如何。 – iruvar

+0

謝謝@ 1_CR關於第三個字段,也許:'sed -r'/ ^(\ S + \ s){2}#/ s/\ s \ S + \ s#//'file'? – potong