Bash从文件中删除重复的单词(正则表达式:sed,awk)

时间:2014-11-10 00:36:48

标签: regex bash sed

我读过其他与我非常相似的问题。但是,当我尝试使用建议的代码时,它无法正常工作

所以我有一个包含以下内容的文件

COMP 232:MATH. FOR COMPUTER SCIENCE:3 credits summer:Lect AA:-T-J--- (10:45-13:15):SGW H-521:KRATOCHVIL, VACLAV Tut AE:-T-J--- (13:45-15:25):SGW H-521 fall:Lect Q:-T-J--- (13:15-14:30):SGW H-820:GRAHNE, GOSTA Tut QA:-T----- (16:15-17:55):SGW H-607 Tut QB:---J--- (14:45-16:25):SGW H-619 fall:Lect R:-T-J--- (13:15-14:30):SGW H-937:NARAYANAN, LATA Tut RA:-T----- (16:15-17:55):SGW H-1070 Tut RB:-T----- (16:15-17:55):SGW GN-M100 fall:Lect DD:--W---- (17:45-20:15):SGW FG-C070:DOEDEL, EUSEBIUS Tut DA:--W---- (20:30-22:10):SGW H-429 Tut DB:--W---- (20:30-22:10):SGW H-619 winter:Lect S:-T-J--- (13:15-14:30):SGW H-561:BERGLER, SABINE Tut SA:-T----- (14:45-16:25):SGW H-920 winter:Lect NN:---J--- (17:45-20:15):SGW H-520:GRAHNE, GOSTA Tut NA:---J--- (20:30-22:10):SGW H-520 Tut NB:-T----- (20:30-22:10):SGW H-607

我希望我的输出是这个

COMP 232:MATH. FOR COMPUTER SCIENCE:3 credits summer:Lect AA:-T-J--- (10:45-13:15):SGW H-521:KRATOCHVIL, VACLAV Tut AE:-T-J--- (13:45-15:25):SGW H-521 fall:Lect Q:-T-J--- (13:15-14:30):SGW H-820:GRAHNE, GOSTA Tut QA:-T----- (16:15-17:55):SGW H-607 Tut QB:---J--- (14:45-16:25):SGW H-619 Lect R:-T-J--- (13:15-14:30):SGW H-937:NARAYANAN, LATA Tut RA:-T----- (16:15-17:55):SGW H-1070 Tut RB:-T----- (16:15-17:55):SGW GN-M100 Lect DD:--W---- (17:45-20:15):SGW FG-C070:DOEDEL, EUSEBIUS Tut DA:--W---- (20:30-22:10):SGW H-429 Tut DB:--W---- (20:30-22:10):SGW H-619 winter:Lect S:-T-J--- (13:15-14:30):SGW H-561:BERGLER, SABINE Tut SA:-T----- (14:45-16:25):SGW H-920 Lect NN:---J--- (17:45-20:15):SGW H-520:GRAHNE, GOSTA Tut NA:---J--- (20:30-22:10):SGW H-520 Tut NB:-T----- (20:30-22:10):SGW H-607

我已尝试过以下代码,但没有一个产生我想要的输出

sed -e 's/\b\([a-z]\+\)[ ,\n]\1/\1/g' temp.txt
sort -u temp.txt

2 个答案:

答案 0 :(得分:1)

GNU awk 4.1

#!/usr/bin/awk -f
@include "join"
{
  split($0, foo, ":")
  if (seen[foo[1]]++)
    $0 = "   " join(foo, 2, length(foo), ":")
}
1

awk save modifications in place

答案 1 :(得分:1)

看起来很冗长,但工作正常:

prev="dummy"
while read line
do
   tag=$(echo $line | grep -Eo "^[a-zA-Z]+:")
   if [ "$tag" == "$prev" ]
   then
     echo "  ${line#$tag}"
   else
     if [ "$tag" != "" ] 
     then
        prev="$tag"
     else
        echo -n "  "
   fi
   echo "$line"
fi
done < /path/to/file