2

私のテキストファイルはアルファベット順にソートされています。各行が次の行に含まれているかどうかを確認し、含まれている場合は最初の行を削除します。たとえば、もし私が持っていたら...

car 
car and trailer
train

…で終わりたい…

car and trailer
train

重複行を検索するコードを含む「sed one-liners」ページを見つけました。

sed '$!N; /^(.*)\n\1$/!P; D'

...そして、^を削除するとうまくいくと思いましたが、そうではありませんでした。

(連続していない行でこれを行うこともできますが、私のファイルは数千行に及ぶため、おそらくスクリプトの実行に数時間または数日かかるでしょう。)

4

3 に答える 3

2

sed は、単一行での単純な置換のための優れたツールです。それ以外の場合は、awk を使用します。

awk '$0 !~ prev{print prev} {prev=$0} END{print}' file
于 2012-12-09T19:56:26.883 に答える
2

The original command

sed '$!N; /^\(.*\)\n\1$/!P; D'

Looks for an exact line match. As you want to check if the first line is contained in the second, you need to add some wild cards:

sed '$!N; /^\(.*\)\n.*\1.*$/!P; D'

Should do it.

于 2012-12-09T07:30:25.883 に答える
0

あなたが言った:

連続していない行でこれを行うのもよいでしょう。

次のスクリプトは、bash別の行に含まれる短い行をすべて削除します。必ずしも連続しているとは限らず、大文字と小文字は区別されません。

#!/bin/bash
# sed with I and Q are gnu extensions:
cat test.txt | while read line; do
   echo Searching for: $line
   sed -n "/.$line/IQ99;/$line./IQ99" test.txt # or grep -i
   if [ $? -eq 99 ]; then
      echo Removing: $line
      sed -i "/^$line$/d" test.txt
   fi   
done

テスト:

$ cat test.txt
Boat
Car
Train and boat
car and cat

$ my_script
Searching for: Boat
Removing: Boat
Searching for: Car
Removing: Car
Searching for: Train and boat
Searching for: car and cat

$ cat test.txt
Train and boat
car and cat
于 2012-12-09T08:35:45.350 に答える