어떤 껍질을 잘라야 할지 지정할 수 있나요? [복사]

어떤 껍질을 잘라야 할지 지정할 수 있나요? [복사]

중복 가능성:
csv 파일을 처리하는 강력한 명령줄 도구가 있습니까?

cut파일에서 열을 추출 하는 데 사용할 수 있는 것 :

$ cat foo
foo,bar,hello
bash,baz,world

$ cut -d\, -f2 foo
bar
baz

하지만 열에 구분 기호가 있고 그러한 셸 내부에서 안전하다면 어떻게 될까요?

$ cat foo
foo,"hello, world",bar
bash,goodbye,baz

$ cut -d\, -f2 temp12
"hello
goodbye

주변 따옴표 문자 를 존중하라고 지시할 수 있는 방법이 있나요 cut?""

답변1

적어도 GNU 클리핑에는 적합하지 않습니다.

/* The delimeter character for field mode. */ static unsigned char delim;

(GNU coreutils 소스 코드에 표시된 대로)

답변2

cut먼저 입력을 따옴표 안의 이스케이프 문자로 전처리하는 경우(예: 따옴표 안의 "_"를 "_u"로 바꾸거나, ","를 "_c"로 바꾸거나, 각 문자를 2단어 섹션 16진수 표기법으로 바꾸면 됩니다) 후처리하여 이스케이프를 복원합니다.

그것은 다음과 같습니다:

perl -pe 's/"(.*?)"/"\"".unpack("H*", $1)."\""/ge' |
  cut -d, -f2 |
  perl -pe 's/"(.*?)"/"\"".pack("H*",$1)."\""/ge'

(따옴표 내부(또는 외부)에 이스케이프된 따옴표가 없다고 가정).

그러나 필요한 노력을 고려하면 적절한 csv 파서를 사용하거나 Perl과 같은 정규식 엔진을 사용하여 모든 작업을 수행하는 것이 더 나을 것입니다.

관련 정보