Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 基于字符串中的特定值进行排序。_Linux_Bash_Shell_Sorting_Scripting - Fatal编程技术网

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甚至不知道我可以使用十进制根据某些字段进行排序。谢谢,那么我就把它作为答案加上;-)