从命令行排序文本文件的一部分

时间:2013-10-31 07:03:58

标签: ruby sorting grep

说我有this text file。我想抓住其中有电影的线条,根据标题匹配标题,打印和排序。我完成了大部分工作:

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

...

3 个答案:

答案 0 :(得分:1)

在ruby示例中,您可以将它们填充到数组中,对数组进行排序并将其打印出来。

使用egrep,你可以将结果传递给sort:

egrep -o "\|\s([A-Z0-9][A-Za-z0-9: ]+)\s+\|" sort_movie_list.feature | sort

答案 1 :(得分:1)

给定的正则表达式不会用逗号(','),点('。')或其他奇怪的东西(如德语变形金刚'ä',感叹号(“火星攻击!”!!))捕捉电影标题。

因此,我会利用给定的格式并假设管道不会出现在电影片目列表中。

因此,要么分割文件,管道(“|”)是字段分隔符,要选择第二个字段,如:

grep "|" movies.txt | cut -f 2 -d"|" | sort

grep "|"是省略没有电影的行,否则cut -f 2 -d "|" movies.txt会这样做。

或在红宝石中使用某些内容

line.split("|")[1]

请注意,在这两种情况下,您可以在之后删除空格。

答案 2 :(得分:0)

好的,我现在已经想到了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

如果某人有更有效/简洁的答案,我总是愿意学习更多。