我需要一个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