首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对多列数据进行排序

对多列数据进行排序
EN

Unix & Linux用户
提问于 2011-06-17 09:51:26
回答 2查看 406关注 0票数 1

输入(未排序,坏)

代码语言:javascript
复制
"XYZ-ZTE-43255 serverB618 agreed","XYZ-ZTE-44432"
,"XYZ-ZTE-43255"
"XYZ-ZTE-52775 serverB110 agreed",
"XYZ-ZTE-79213 - serverB688 agreed",
"XYZ-ZTE-77323 serverB617 agreed",
"XYZ-ZTE-81422 - serverB609 agreed","XYZ-ZTE-77323"
"XYZ-ZTE-32785 - serverA626 agreed","XYZ-ZTE-52775"
"XYZ-ZTE-43235 - serverA605 disagreed (asdfjlasdj yxvv il lkyeas sadfa)","XYZ-ZTE-43235"
"XYZ-ZTE-11591 serverB144 agreed",
,"XYZ-ZTE-11591"

输出(排序,所需的,好的!)

代码语言:javascript
复制
"XYZ-ZTE-43255 serverB618 agreed","XYZ-ZTE-43255"
,"XYZ-ZTE-44432"
"XYZ-ZTE-52775 serverB110 agreed","XYZ-ZTE-52775"
"XYZ-ZTE-79213 - serverB688 agreed",
"XYZ-ZTE-77323 serverB617 agreed","XYZ-ZTE-77323"
"XYZ-ZTE-81422 - serverB609 agreed",
"XYZ-ZTE-32785 - serverA626 agreed",
"XYZ-ZTE-43235 - serverA605 disagreed (asdfjlasdj yxvv il lkyeas sadfa)","XYZ-ZTE-43235"
"XYZ-ZTE-11591 serverB144 agreed","XYZ-ZTE-11591"

简而言之:这是一个带有两列的XLS的片段。这两列必须以如下方式排列起来:

左列中的XYZ-ZTE-77323与右列上的XYZ-ZTE-77323匹配。

但是有这样的事情:

代码语言:javascript
复制
,"XYZ-ZTE-43255"

它必须与这句话相符:

代码语言:javascript
复制
"XYZ-ZTE-43255 serverB618 agreed","XYZ-ZTE-43255"

但是,行(在输入中)已经包含了一个右列:

代码语言:javascript
复制
"XYZ-ZTE-43255 serverB618 agreed","XYZ-ZTE-44432"

例如,如果:

代码语言:javascript
复制
"XYZ-ZTE-44432"

在左列中不存在,则它必须位于输出中的新行中。

有人知道怎么做吗?

EN

回答 2

Unix & Linux用户

发布于 2011-06-17 10:56:24

将数据填充到数据库中,然后使用联接根据您喜欢的任何条件检索数据。SQLite是一个很好的轻量级系统,没有服务器组件,这对于以这种方式操作小数据集是很好的。

票数 1
EN

Unix & Linux用户

发布于 2011-06-29 04:18:08

这会产生预期的输出,使用python。这有点麻烦,因为我不太了解Pyton,但它起作用了:)

代码语言:javascript
复制
#!/bin/bash

python -c '
import sys, csv;
reader = csv.reader(sys.stdin)
nbli=0 # line number (to maintin input order)
nbwi=6 # width of line number.. (zero padded) 
left=[] 
rght=[] 
for row in reader:
    nbli+=1
    fnum=format(nbli, "0"+str(nbwi)+"d")
    if row[0] != "": left.append(row[0]+fnum) 
    if row[1] != "": rght.append(row[1]+fnum)
left.sort()
rght.sort()
coll = []
l ,r = 0, 0
while l < len(left) or r < len(rght):
    #
    if l >= len(left):
        numr = rght[r][-nbwi:]
        datr = rght[r][:len(rght[r])-nbwi]
        coll.append(numr + " " + ",\"" + datr + "\"")
        r+=1
    elif r >= len(rght):
        numl = left[l][-nbwi:]
        datl = left[l][:len(left[l])-nbwi]
        coll.append(numl + " " + "\"" + datl + "\",")
        l+=1
    else:
        numl = left[l][-nbwi:]
        numr = rght[r][-nbwi:]
        datl = left[l][:len(left[l])-nbwi]
        datr = rght[r][:len(rght[r])-nbwi]
        #
        if datl.startswith(datr+" "):
            coll.append(numl + " " + "\"" + datl + "\",\"" + datr + "\"")
            l+=1
            r+=1
        elif datl < datr + " ":
            coll.append(numl + " " + "\"" + datl + "\",")
            l+=1
        else:
            coll.append(numr + " " + ",\"" + datr + "\"")
            r+=1

coll.sort()
c = 0
while c < len(coll):
    print coll[c][nbwi+1:]
    c+=1
' \
<<-'STDIN'
"XYZ-ZTE-43255 serverB618 agreed","XYZ-ZTE-44432"
,"XYZ-ZTE-43255"
"XYZ-ZTE-52775 serverB110 agreed",
"XYZ-ZTE-79213 - serverB688 agreed",
"XYZ-ZTE-77323 serverB617 agreed",
"XYZ-ZTE-81422 - serverB609 agreed","XYZ-ZTE-77323"
"XYZ-ZTE-32785 - serverA626 agreed","XYZ-ZTE-52775"
"XYZ-ZTE-43235 - serverA605 disagreed (asdfjlasdj yxvv il lkyeas sadfa)","XYZ-ZTE-43235"
"XYZ-ZTE-11591 serverB144 agreed",
,"XYZ-ZTE-11591"
STDIN

输出:

代码语言:javascript
复制
"XYZ-ZTE-43255 serverB618 agreed","XYZ-ZTE-43255"
,"XYZ-ZTE-44432"
"XYZ-ZTE-52775 serverB110 agreed","XYZ-ZTE-52775"
"XYZ-ZTE-79213 - serverB688 agreed",
"XYZ-ZTE-77323 serverB617 agreed","XYZ-ZTE-77323"
"XYZ-ZTE-81422 - serverB609 agreed",
"XYZ-ZTE-32785 - serverA626 agreed",
"XYZ-ZTE-43235 - serverA605 disagreed (asdfjlasdj yxvv il lkyeas sadfa)","XYZ-ZTE-43235"
"XYZ-ZTE-11591 serverB144 agreed","XYZ-ZTE-11591"
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/15166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档