如何使用带引号的字段(可能包含分隔符)对CSV进行排序

时间:2017-12-19 22:45:17

标签: linux shell unix sh posix

在shell脚本中,我尝试对CSV文件进行排序。某些字段可能包含分隔符,并引用它以正确处理此问题。我们假设我有一个文件:

from typing import TypeVar, Generic, Callable

T = TypeVar('T')


class Signal(Generic[T]):
    def connect(self, connector: Callable[[T], None]) -> None:
        pass

    def emit(self, payload: T):
        pass


class A:
    def __init__(self) -> None:
        self.signal = Signal[A]()

    def do(self) -> None:
        self.signal.emit(self)

def handle_b(b: "B") -> None:
    print(b.something)

class B(A):
    def __init__(self) -> None:
        super().__init__()
        self.signal.connect(handle_b)

    @property
    def something(self) -> int:
        return 42

我想在第一列上排序,然后是第三列。结果应该是:

"2",D,Clair
1,R,Alice
"3","F","Dennis"
2,"P,F",Bob

字段中可能还有双重引号。通常,CSV将符合RFC 4180

我尝试使用1,R,Alice 2,"P,F",Bob "2",D,Clair "3","F","Dennis" 执行此操作,但这不起作用,因为sort -t , -k 1,1 -k 3,3并不了解CSV中引号的特殊含义。我无法找到让sort以这种方式行事的方法。也许我应该使用另一个命令,但我找不到任何命令。

如何对CSV进行排序?

1 个答案:

答案 0 :(得分:3)

我会用出色的xsv来完成这项工作:

$ xsv sort --no-headers --select 1,2 input.csv
1,R,Alice
2,D,Clair
2,"P,F",Bob
3,F,Dennis

csvkit也可以做到:

$ csvsort --no-header-row --columns 1,2 input.csv
a,b,c
1,R,Alice
2,D,Clair
2,"P,F",Bob
3,F,Dennis