sed
1980年代にリリースされたすべてのゲームに関する情報を検索して表示し、結果をアルファベット順に並べるコマンドが必要です。 justを使用してこれを行うための良い方法はありますかsed
?
1 Wii Sports Wii 2006 Nintendo 41.36
2 Super Mario Bros. NES 1985 Nintendo 29.08
3 Duck Hunt NES 1985 Nintendo 26.93
4 Tetris GB 1989 Nintendo 23.20
5 Mario Kart Wii Wii 2008 Nintendo 15.91
6 Wii Sports Resort Wii 2009 Nintendo 15.61
7 Kinect Adventures! X360 2010 MS Game Studios 15.09
8 New Super Mario Bros. Wii Wii 2009 Nintendo 14.53
9 Wii Play Wii 2007 Nintendo 13.96
10 Super Mario World SNES 1991 Nintendo 12.78
11 New Super Mario Bros. DS 2006 Nintendo 11.28
12 Pokémon Red/Green/Blue GB 1998 Nintendo 11.27
13 Super Mario Land GB 1989 Nintendo 10.83
14 Call of Duty: Black Ops X360 2010 Activision 9.76
15 Mario Kart DS DS 2005 Nintendo 9.71
16 Super Mario Bros. 3 NES 1990 Nintendo 9.54
17 Grand Theft Auto:San Andreas PS2 2004 Rockstar Games 9.43
18 Call of Duty: Modern Warfare X360 2011 Activision 9.07
19 Grand Theft Auto V X360 2013 Rockstar Games 9.0
答え1
sed
awk
必要なデータを抽出するために使用することは不可能ではありませんが、フィールド(列)で構成されるレコード(行)で整理できるデータを扱うのに適しているため、不必要に複雑な練習になります。難しいのは、4番目の列に一致する正規表現を見つけ、それが正しい範囲の整数であることを確認することです。整数を計算して処理するのはうまくいきません。sed
並べ替え時に迷惑。
データがタブで区切られているとします(「アルファベット順」は「辞書順」を意味します)。
awk -F '\t' '$4 >= 1980 && $4 < 1990' file | sort -k 2
これにより、awk
タブ区切りの4番目のフィールド(年)が1980年から1989年の間の数字である行を抽出します。結果の行は、スペースで区切られた2番目のフィールド(タイトルと行の残りの部分)でアルファベット順にソートされます。
ファイルがスペースで区切られている場合は、タブ文字の代わりに複数のスペースで構成されるランダムな順序を区切り文字として使用できます。
awk -F ' {2,}' '$4 >= 1980 && $4 < 1990' file | sort -b -k 2
-b
ここで使用されているオプションを参照してくださいsort
。 2番目のフィールドの先行スペースは無視する必要があります。データの区切り文字が単一のタブ文字の場合は必要ありません。
質問のデータから私が得たもの
3 Duck Hunt NES 1985 Nintendo 26.93
2 Super Mario Bros. NES 1985 Nintendo 29.08
13 Super Mario Land GB 1989 Nintendo 10.83
4 Tetris GB 1989 Nintendo 23.20
答え2
名前に基づいてアルファベット順にゲームを並べ替えるには、それを使用しますsort
。ここでは、#
データセットに存在しないフィールド区切り文字として選択しました。
しかし、最初に1980年代のゲームを選択する必要があるので、grep
次の方法を使用しました。
grep -E '^.{39}198.' games | sort -t'#' -k1.5,1.34
あなたの例の出力:
3 Duck Hunt NES 1985 Nintendo 26.93
2 Super Mario Bros. NES 1985 Nintendo 29.08
13 Super Mario Land GB 1989 Nintendo 10.83
4 Tetris GB 1989 Nintendo 23.20