Linux 基于字符串中的特定值进行排序。
我有一个包含以下内容的文件:Linux 基于字符串中的特定值进行排序。,linux,bash,shell,sorting,scripting,Linux,Bash,Shell,Sorting,Scripting,我有一个包含以下内容的文件: 666500872101_002.log 738500861101_003.log 738500861101_002.log 666500872101_001.log 741500881101_001.log 738500861101_001.log 741500881101_002.log 666500872101_003.log 741500881101_003.log 666500
666500872101_002.log
738500861101_003.log
738500861101_002.log
666500872101_001.log
741500881101_001.log
738500861101_001.log
741500881101_002.log
666500872101_003.log
741500881101_003.log
666500872101_004.log
738500861101_001.log
738500861101_002.log
738500861101_003.log
666500872101_001.log
666500872101_002.log
666500872101_003.log
666500872101_004.log
741500881101_001.log
741500881101_002.log
741500881101_003.log
我需要首先根据字段5到8中的值对行进行排序,即741500881101_003.log,然后根据日志的零件号进行排序,即。
741500881101003。记录以下内容:
666500872101_002.log
738500861101_003.log
738500861101_002.log
666500872101_001.log
741500881101_001.log
738500861101_001.log
741500881101_002.log
666500872101_003.log
741500881101_003.log
666500872101_004.log
738500861101_001.log
738500861101_002.log
738500861101_003.log
666500872101_001.log
666500872101_002.log
666500872101_003.log
666500872101_004.log
741500881101_001.log
741500881101_002.log
741500881101_003.log
使用
sort
无法获得任何好结果,请提供帮助。您可以使用sort
命令,并使用以下选项:
sort -n -k1.5,1.8 -n -k1.14,1.16 fileToSort.log
选项:
用于数字排序-n
和-k1.5,1.8
来定义排序键-k1.14,1.16
$ sort -n -k1.5,1.8 -n -k1.14,1.16 fileToSort
738500861101_001.log
738500861101_002.log
738500861101_003.log
666500872101_001.log
666500872101_002.log
666500872101_003.log
666500872101_004.log
741500881101_001.log
741500881101_002.log
741500881101_003.log
作为学习火花的一部分,我解决了这个问题。我不是unixshell程序员。因此,我想到了用火花来解决这个问题
val logList = Array("666500872101_002.log","738500861101_003.log","738500861101_002.log","666500872101_001.log","741500881101_001.log","738500861101_001.log","741500881101_002.log","666500872101_003.log","741500881101_003.log","666500872101_004.log")
val logListRDD = sc.parallelize(logList)
logListRDD.map(x=>((x.substring(4,8), x.slice(x.indexOfSlice("_") +1, x.indexOfSlice("."))),x)).sortByKey().values.collect.take(20)
输出:
数组[字符串]=数组(738500861101_001.log,738500861101_002.log,738500861101_003.log,66650082101_001.log,666500872101_002.log,666500872101_003.log,66650082101_004.log,741500881101_001.log,741500881101_002.log,741500881101_003.log)
解释我做了什么
sc.parallelize(日志列表)-是创建RDD的步骤,RDD是spark的核心组件
map(x=>((x.substring(4,8),x.slice(x.indexOfSlice(“”)+1,x.indexOfSlice(“.”)),x))-从数组中提取内容并生成一个键值对。在我们的例子中,value是***。log值,key是一个子字符串数组,我们希望根据它进行排序(0086001)。键值对看起来像[(0086001),738500861101_001.log]
sortByKey()-根据上面生成的键对数据进行排序
值-获取与键对应的值
collect.take(20)->在屏幕上显示o/p到目前为止您尝试了什么?如果您有,我们可以看看它们吗?您可以试试
sort-n-k1.5,1.8-k1.14,1.16 fileToSort.log
或sort-n-k1.5,1.8-n-k1.14,1.16 fileToSort.log
并告诉我它是否适合您吗?找到了这个@艾伦:谢谢,伙计,我被困在只使用排序上了——k1,1甚至不知道我可以使用十进制根据某些字段进行排序。谢谢,那么我就把它作为答案加上;-)