Linux

sed 命令幫助

  • November 11, 2021

我需要一個sed命令來搜尋和顯示 1980 年代發布的所有遊戲的資訊並按字母順序排列這些結果。有沒有隻使用的好方法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

使用它來提取想要的數據並非不可能sed,但這將是一個不必要的複雜練習,因為它awk更適合處理可以組織成由欄位(列)組成的記錄(行)的數據。困難在於想出一個匹配第 4 列的正則表達式,然後確定它是否是正確範圍內的整數。除了在計算和處理除單個數字字元串之外的任何整數方面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

引用自:https://unix.stackexchange.com/questions/676988