sed 命令帮助

sed 命令帮助

我需要一个sed命令来搜索和显示 20 世纪 80 年代发行的所有游戏的信息,并按字母顺序排列这些结果。有没有一种只使用 来做到这一点的好方法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它更适合处理可以组织成由字段(列)组成的记录(行)的数据。困难在于想出一个匹配第四列的正则表达式,然后确定它是否是正确范围内的整数。除了在计算和处理整数方面表现不佳之外,sed排序时很糟糕

假设数据是制表符分隔的(并且“按字母顺序排列”意味着“按字典顺序排序”):

awk -F '\t' '$4 >= 1980 && $4 < 1990' file | sort -k 2

这用于awk提取第 4 个制表符分隔字段(年份)是 1980 到 1989 之间的数字的行。然后,结果行在第二个空格分隔字段(标题和该行的其余部分)上按字典顺序排序)。

如果文件由空格分隔,您可以尝试使用两个或多个空格的任意序列作为分隔符来代替制表符:

awk -F ' {2,}' '$4 >= 1980 && $4 < 1990' file | sort -b -k 2

请注意此处-b使用的选项sort。需要忽略第二个字段的前导空格。如果数据中的分隔符是单个制表符,则不需要。

我从问题中的数据得到的结果是

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。这里我选择#作为字段分隔符,因为它在数据集中不存在。

不过,首先,您需要选择 20 世纪 80 年代的游戏,所以我使用了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

相关内容