Ruby 从命令行对文本文件的部分进行排序
说我有。我想抓取其中包含电影的行,匹配标题,打印,并根据标题进行排序。我大部分时间都是通过:Ruby 从命令行对文本文件的部分进行排序,ruby,sorting,grep,Ruby,Sorting,Grep,说我有。我想抓取其中包含电影的行,匹配标题,打印,并根据标题进行排序。我大部分时间都是通过: File.open("features/sort_movie_list.feature","r").each {|line| puts [$1] if line =~ /\|\s+([A-Z0-9][a-zA-Z0-9: ]+)\s+\|/} 但我不知道如何从那里分类。我通过grep找到了一些方法: egrep -o "\|\s([A-Z0-9][A-Za-z0-9: ]+)\s+\|" sort_m
File.open("features/sort_movie_list.feature","r").each {|line| puts [$1] if line =~ /\|\s+([A-Z0-9][a-zA-Z0-9: ]+)\s+\|/}
但我不知道如何从那里分类。我通过grep
找到了一些方法:
egrep -o "\|\s([A-Z0-9][A-Za-z0-9: ]+)\s+\|" sort_movie_list.feature
但我不知道如何只打印括号内的匹配。您将如何执行此操作以使输出如下所示
2001: A Space Odyssey
Aladdin
Amelie
Chicken Run
...
在ruby示例中,您可以将它们填充到一个数组中,对数组进行排序并打印出来 使用egrep,您可以通过管道将结果排序:
egrep -o "\|\s([A-Z0-9][A-Za-z0-9: ]+)\s+\|" sort_movie_list.feature | sort
好的,我现在已经为Ruby找到了答案。感谢David建议使用数组
movie_titles = []
File.open("features/sort_movie_list.feature","r").each {|line| movie_titles.push($1.strip) if line =~ /\|\s+([A-Z0-9][a-zA-Z0-9: ]+)\s+\|/}
puts movie_titles.sort
如果有人有一个更有效/简洁的答案,我总是乐于学习更多。给定的正则表达式不会捕捉到带有逗号(“,”)、圆点(“.”)或其他奇怪内容(如德语Umlauts“ä”、感叹词(“火星攻击!”)的电影标题 因此,我将利用给定的格式并假设管道不会出现在电影标题列表中 因此,可以将文件分成若干部分,其中管道(“|”)是字段分隔符,然后选择第二个字段,如:
grep "|" movies.txt | cut -f 2 -d"|" | sort
(grep“|”是省略没有电影的行,否则cut-f2-d“|”movies.txt
就可以了)
或者在ruby中使用类似的东西
line.split("|")[1]
请注意,在这两种情况下,您都可以在以后去掉空格。啊,是的。我不需要使用egrep提取标题,就可以使用sort对行进行正确排序。谢谢。再次查看您的输入文件时,最好只取范围内的字符,因为第二个“列”似乎是固定长度的。像这样,你甚至可以拍摄标题中带有管道符号的电影。