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
필요한 데이터를 추출하는 데 사용하는 것이 불가능하지는 않지만, 필드(열)로 구성된 레코드(행)로 정리할 수 있는 데이터를 다루는 데 더 적합하므로 불필요하게 복잡한 연습이 될 것입니다 . 어려운 점은 네 번째 열과 일치하는 정규식을 찾아낸 다음 그것이 올바른 범위의 정수인지 확인하는 것입니다. 정수를 계산하고 처리하는 데 능숙하지 않을 뿐만 아니라sed
정렬할 때 짜증나.
데이터가 탭으로 구분되어 있다고 가정합니다("알파벳순"은 "사전순"을 의미함).
awk -F '\t' '$4 >= 1980 && $4 < 1990' file | sort -k 2
그러면 awk
탭으로 구분된 네 번째 필드(연도)가 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
. 여기서는 #
데이터 세트에 존재하지 않는 필드 구분 기호로 선택했습니다 .
하지만 먼저 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