次の文字列があります。
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