
sort -u
特定の削除目的のための完全なオプション削除されましたか?
答え1
perl -ae 'print unless $seen{"@F"}++' < file
空白で連結されたフィールドが以前に見られた場合F
(@F
wkモードで)、1行は印刷されません。出力も並べ替えるには、a
次にパイプします。sort
この場合、フィールドはASCIIスペース文字(スペース、水平タブ、改行、キャリッジリターン、フォームフィード、および5.18以降の垂直タブ、isspace()
CロケールのPOSIX一致と同じ)で区切られます。
¹二重引用符内の要素は、デフォルトでは空白の@list
特殊変数の値を使用して連結されます。$"
"@F"
join(" ", @F)
答え2
sort
それ自体は好きなようにはなりません。あなたの仕様は少し曖昧ですが、一般的なアプローチは入力を正規化し(たとえば、各行の終わりと始めにあるすべてのスペースを削除し、複数の連続したスペースを1つのスペースに置き換える)、tr --squeeze-repeats ' ' ' '
結果をソートすることです。
一般的なパイピング操作により、これを簡単に実行できます。これらすべてを単一のsed
コマンドにまとめることができますが、データを適用するとき(コンピュータ用語で)それほど大きくないと仮定しますsort
。
input_command | sed 's/^ *//' | sed 's/ *$//' | tr --squeeze-repeats ' ' ' ' | sort -u
得られる出力が必ずしも実際の入力行と一致するわけではありません。たとえば、次のようになります。
d c b a
a b c d
a b c d
は入力で、出力は次のようになります。
a b c d
d c b a
両方の行は存在しません正確に 入力にはありますが、入力の行と同じ同等クラスの代表です。
実際の入力行を再現する必要がある場合、シェルプログラミングにはPythonのコードの4行の半分が必要な場合があり、関連配列を持つ他の言語(dict
Pythonの場合)が必要になる場合があります。
実際、Pythonはdict
繰り返し順序を指定できないため、ここではエレガントな選択肢ではありません。 Python 3.7+では挿入順序が保証されていますが、これはdict
使いやすいです。
std::set<std::string, [](const auto &a , const auto& b){ return normalize(a) > normalize(b); }> unique_lines;
独自の標準化された機能を備えたC ++タイプがnormalize
より良いでしょう。
std::set<std::string,
[](const auto &a, const auto &b) {
return normalize(a) > normalize(b);
}>
lineset;
std::ifstream in_file("yourinputfile.txt");
std::copy(std::istream_iterator<std::string>(in_file),
std::istream_iterator<std::string>(),
std::inserter(lineset, lineset.end()));
for (const auto &unified_line : lineset)
std::cout << std::format("{}\n", unified_line);