文字列から隣接する重複語を削除する

文字列から隣接する重複語を削除する

次の文字列があります。

one one tow tow three three tow one three

重複した単語を削除して次のように作成するにはどうすればよいですか?

one tow three tow one three

重要なのは、隣接する重複語だけを削除するスクリプトを作成したいということです。

私は試した:

echo "$string" | awk '{for (i=1;i<=NF;i++) if (!a[$i]++) printf("%s%s",$i,FS)}{printf("\n")}'

ただし、隣接していない重複語も削除します。

ベストアンサー1

複数文字RS\s速記にGNU awkを使用する:

$ echo 'one one tow tow three three tow one three' |
awk -v RS='\\s+' '
    $0 != prev { out = (NR>1 ? out OFS : "") $0; prev = $0 }
    END { print out }
'
one tow three tow one three

またはまだGNU awkですが、以下からインスピレーションを受けました。@nezabudkaの返信ただし、入力フィールドを区切るスペースの順序と入力フィールドに含まれる文字に関係なく正しく機能し、出力が終了するようにいくつかの変更が行われたため、\n有効なPOSIXテキストです。文書:

$ echo one one tow tow three three tow one three |
awk -v RS='[[:blank:]]+' '
    $1 != prev { out = out $1 RT; prev=$1 }
    END { print out }
'
one tow three tow one three

それ以外の場合は awk を使用してください。

$ echo 'one one tow tow three three tow one three' |
awk '{
    out = $1
    for ( i=2; i<=NF; i++ ) {
        if ( $i != $(i-1) ) {
            out = out OFS $i
        }
    }
    print out
}'
one tow three tow one three

おすすめ記事