数値順に並べ替え

数値順に並べ替え

入力ファイルからISBN番号(3番目の列)でリストをソートしてから、出力ファイルfile.shfile.out)に送信する必要があります。入力ファイル(file.input)にはリストがあります。

Donald Smith,Fire Lands,97868545414459
Adam Barry,The Armies,97564325678855
Jennifer Lelan,Childhood dreams,97546766544237

繰り返し構造を使用してデータとヘッダーを処理しますAuthor Name of book ISBN

結果

Author                   Name of Book               ISBN

Jennifer  Lelan    Chilhood Dreams   97546766544237
Adam Barry          The Armies             97564325678855
Donald Smith        Fire Lands              97868545414459

ベストアンサー1

最初の部分は2023年に追加された新しい答えです。以前の答えは、区切り文字の後にも機能します。

$ mlr --icsv --implicit-csv-header --opprint  label Author,Title,ISBN then sort -n ISBN file.input
Author         Title            ISBN
Jennifer Lelan Childhood dreams 97546766544237
Adam Barry     The Armies       97564325678855
Donald Smith   Fire Lands       97868545414459

これは以下を使用します。ミラーmlr)はデータを無題のCSVに読み込み、3つのフィールドにラベルを追加し、フィールドのレコードを数字で並べ替え、ISBNすべてのデータを「印刷可能な」表形式で出力します。 MillerはCSVをサポートしているため、カンマ、改行などを含む引用フィールドを処理できます。

質問のように長いタイトルの'Name of Book'代わりに(引用符)を使用してください。タブで区切られた値の出力を生成するには、代わりにTitle使用してください。--otsv--opprint

>file.outputファイルを上書きまたは生成するコマンドをリダイレクトしますfile.output


まず、あなたはいいえこのデータを繰り返します。シェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?

ファイルの唯一のカンマがフィールドを区切るカンマである場合

sort -t ',' -k3n -o file.output file.input

データは、3番目の列の数字に基づいて数字でソートされます。出力が記録されますfile.output

与えられたデータについてはfile.output次のようになります。

Jennifer Lelan,Childhood dreams,97546766544237
Adam Barry,The Armies,97564325678855
Donald Smith,Fire Lands,97868545414459

このデータをさらに処理するには、awkプログラムの使用を検討してください。どのような処理を実行するかを指定していないため、次は各行のデータを変数(実際には不要)に抽出して印刷します。

sort -t ',' -k3n file.input |
awk -F ',' '{ author=$1; title=$2; isbn=$3;
              printf("Author: %s\nTitle: %s\nISBN: %s\n",
                     author, title, isbn) }'

この場合、ソートされたデータを中間ファイルに保存する必要はありません。

質問のデータ出力を提供します。

Author: Jennifer Lelan
Title: Childhood dreams
ISBN: 97546766544237
Author: Adam Barry
Title: The Armies
ISBN: 97564325678855
Author: Donald Smith
Title: Fire Lands
ISBN: 97868545414459

データをクールな列に入れてISBN番号にダッシュを使用する必要はありません。 ISBN番号形式と列形式には、awk次のものが使用されます。sedcolumn

sort -t ',' -k3n file.input |
sed -E -e 's/,([0-9]{3})([0-9]{4})([0-9]{5})/,\1-\2-\3-/' |
column -s ',' -t

出力は次のとおりです

Jennifer Lelan  Childhood dreams  975-4676-65442-37
Adam Barry      The Armies        975-6432-56788-55
Donald Smith    Fire Lands        978-6854-54144-59

ISBN番号が少し奇妙に見えます。その理由は長さが14ビットだからです。 本物ISBN長さは10桁または13桁です。、上記のコードでは13桁(または少なくとも12桁)と仮定しています。

列ヘッダーを追加するには:

sort -t ',' -k3n file.input |
{ echo 'Author,Name of book,ISBN'
  sed -E -e 's/,([0-9]{3})([0-9]{4})([0-9]{5})/,\1-\2-\3-/'
} |
column -s ',' -t

生産する

Author          Name of book      ISBN
Jennifer Lelan  Childhood dreams  975-4676-65442-37
Adam Barry      The Armies        975-6432-56788-55
Donald Smith    Fire Lands        978-6854-54144-59

...シェルで明示的なループを使用せずに。

おすすめ記事