Linux
sed 命令幫助
我需要一個
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