1

我有一个 MAC 供应商列表,我需要解析文本以删除不需要的信息。

如果我有这个

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.

我需要删除所有[space][word][#]才能拥有这个

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.

可以用grepsed完成吗?:S

对不起,我的英语不好

4

5 回答 5

4

这是一个仅限外壳的解决方案:

while read A B C D;do
  [ "$C" == "#" ] && echo "$A $D" || echo "$A $B $C $D"
done < infile.txt >outfile.txt
于 2013-09-29T02:26:59.753 回答
4

这可能对您有用(GNU sed):

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

或者:

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

这意味着:查找一个空格,后跟一个或多个非空格,然后是另一个空格,然后是 a #,然后删除该表达式。该文件已更新到位,这就是该-i选项的含义。-r第一个解决方案中的选项允许syntatic sugar使用,在这种情况下,允许您编写\S+而不是\S\+or [^ ][^ ]*

于 2013-09-29T05:53:34.203 回答
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.
于 2013-09-28T23:40:12.327 回答
2

假设#当它发生时在字段 3 中独立存在,以下解决方案可能会起作用

awk '$3 == "#"{t=$1; $1=$2=$3=""; sub(/^[[:space:]]+/, ""); $0=t" "$0}; 
     {print}' file.txt
于 2013-09-28T23:55:48.393 回答
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

这只是删除了我们不想要的东西。

于 2013-09-29T07:42:41.030 回答