助け合いフォーラム

LinuC

LinuC Lv1-101(Ver10.0)
問題ID : 39050
問題を開く
カレントディレクトリにテキストファイル「FileA」、「FileB」がある。
「FileA」と「FileB」の内容を合わせて並び替え、重複行を除き、結果を別のファイル「List」に追記するには次のどのコマンドを実行すればよいか。

正解

sort File* | uniq >> List

解説

本問を解くための全体的な流れを最初に示します。
まず、「FileA」と「FileB」の内容を合わせて並び替えるには、【1】sortコマンドに「File*」を指定することで「FileA」と「FileB」を対象として内容をソートします。次に、重複行を除くには【2】uniqコマンドを使用します。最終的に、【3】「>>」により得られた結果を指定ファイルに出力して追記します。

複数のコマンドの間に「パイプ(|)」を用いることで、一つのコマンドの実行結果を別のコマンドに直接、入力として渡すことが可能です。具体的には、パイプの左側に位置するコマンドが標準出力するデータが、パイプの右側に位置するコマンドの標準入力として受け取られます。これにより、一連のコマンドを組み合わせて複雑な操作を一度に実行することができます。

以下に、【1】から【3】までに挙げたコマンドやリダイレクト演算子の詳細を説明します。

【1】sortコマンドは、行単位でファイルの内容をソートするコマンドです。
sortコマンドの書式と主なオプションは以下のとおりです。
sort [オプション] [ファイル名]


【2】uniqコマンドは、ソートされているファイルにある連続して重複した行を1行にまとめて表示するコマンドです。uniqコマンドは、離れた位置にある同じ内容の行はまとめられないため、既にソートされているファイルに対して実行することにより効果を発揮します。
uniqコマンドの書式は以下のとおりです。
uniq [オプション] [入力ファイル [出力ファイル]]
※出力ファイルを指定した場合は、コマンドの実行結果は画面ではなく出力ファイルに出力されます。

【3】「>>」というリダイレクト演算子は、得られた結果を既に存在する指定ファイルに「追記」します。
主なリダイレクト演算子は以下のとおりです。これらを使用することで、入力元や出力先を変更できます。


したがって正解は
・sort File* | uniq >> List
です。

以下は、実行例です。


その他の選択肢は以下のとおりです。

・tee File* | uniq > List
まずsortコマンドを実行し、重複行を連続させてからuniqコマンドを実行する必要がありますので、誤りです。
teeは、標準入力の内容を、標準出力先(デフォルトはディスプレイ)とファイルの双方に出力するコマンドです。teeは通常、パイプ(|)の後に使用します。
また、「>」では追記できません。「>」に既存のファイルを指定した場合は、内容が上書きされますので注意してください。

・sort File* | cut > List
このコマンドでは重複行を除くことができないため、誤りです。
cutは、テキストファイルの各行から指定したフィールドを取り出して表示するコマンドです。なお、cutは引数でフィールドを指定する必要があります。
また、「>」では追記できません。「>」に既存のファイルを指定した場合は、内容が上書きされますので注意してください。

・expand File* | uniq << List
まずsortコマンドを実行し、重複行を連続させてからuniqコマンドを実行する必要がありますので、誤りです。
expandは、タブをスペースに変換するコマンドです。
また、「<<」では追記できません。「<<」はヒアドキュメントといい、終了文字が現れるまでコマンドの標準入力に入力を送るリダイレクト演算子です。

・cut File* | unexpand >> List
このコマンドでは重複行を除くことができないため、誤りです。
cutは、テキストファイルの各行から指定したフィールドを取り出して表示するコマンドです。なお、cutは引数でフィールドを指定する必要があります。
unexpandは、連続するスペースをタブに変換するコマンドです。

参考

uniqコマンドはソートされているファイルにある連続して重複した行を1行にまとめて表示するコマンドです。

uniqコマンドの書式は以下のとおりです。

uniq [オプション] [入力ファイル [出力ファイル]]

なお、出力ファイルを指定するとコマンドの実行結果は画面ではなく出力ファイルに出力されます。

例)「file」ファイルにある連続した重複行を扱う場合


uniqコマンドは連続していない重複行をまとめることはできません。
ファイル内の重複行が連続していない場合や、複数のファイルを対象にする場合は、まずsortコマンドを実行し、重複行を連続させてからuniqコマンドを実行する必要があります。
上に戻る

uniqコマンドについて

投稿日 2024/11/26

uniqコマンドはデフォルトだと「重複している行を表示」だと認識しており、問題文の「重複行を除き表示」(重複していない行を表示と解釈しています)だと、「-u」が必要だと思うにですが、デフォルトのままなのはなぜでしょうか。どなたか教えていただきたいです。

2024/11/27 08:44

uniqコマンドはデフォルトだと「重複している行を表示」だと認識しており

あれ?解説や参考には、 uniq コマンドの機能として

連続して重複した行を1行にまとめて表示する

と記載されているのですが、こちらについてはどのように理解されていますか?

また、問題文の「重複行を除き」は「重複した内容を出力しない」という意図かなと思っているので

重複していない行を表示

というのはちょっと違うかなぁと思います。(とはいえ、こういう誤認を避けるためには「除き」→「取り除き」の方が良いのかなとは思います)


コメント

P Pnt785_428

2024/11/27 09:53

ありがとうございます。「uniq」コマンドについては私の勘違いと理解不足による誤認でした。参考にも「重複した行を1行にまとめて表示」と書かれていました。 問題文に関しても私の理解力不足による誤答でした。 いずれにせよ、まだまだ理解・知識が足りないので回答者様の回答を参考に理解できるまでゆっくり咀嚼しようと思います。 でもやはり問題文が勘違いしやすいのかなぁと言い訳じみた考えは浮かんでしまいますね。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?