2010-03-15 3 views
2

일반적으로 모든 라인에서 마지막 토큰을 제거하고, 각 라인에서 첫 번째 두 개의 토큰을 추출하고, 각 라인을 토큰으로 분할하는 것과 같이 내 연구를 위해 상당한 양의 텍스트 처리를 수행해야합니다.Linux 또는 Mac에서 텍스트 처리를 수행하는 가장 좋은 도구는 무엇입니까?

이것을 수행하는 가장 좋은 방법은 무엇입니까? 이걸 펄을 배워야할까요? 아니면 쉘 명령을 배워야합니까? 주요 관심사는 속도입니다. 그런 것들을위한 긴 코드를 작성해야한다면, 그 목적을 이길 수 있습니다.

편집 : 내가 필요한 일을 할 수있는 이미 @Mimisbrunnr의 추천에 나오지도하고 배우기 시작

. 그러나 그것은 사람들이 awk를 더 좋아하는 것으로 보인다. 그래서, 그것을 시도합니다. 모든 답장을 보내 주셔서 감사합니다.

+0

이미 알고있는 프로그래밍 언어는 무엇입니까? – mob

+0

C, Java, Python의 조금 .. 다른 것들 중에서. – euphoria83

+6

'정규 표현식 습득'을 읽고 Perl, Python 또는 Ruby를 배우거나 실험실/현장/동료/가까운 사람 중에서 가장 많이 사용되는 언어를 정기적으로 질문 할 수 있습니다. – jfs

답변

6

새로운 언어를 배우지 않으려 고한다면 파이썬이 할지라도 Perl과 awk가 마음에 듭니다.

Perl은 범용 언어입니다. awk는 앞서 설명한 유형의 텍스트 처리에보다 중점을두고 있습니다.

+2

"문제가 생길 때마다 'AWK를 사용하자'라고 말합니다. 이제 그들은 두 가지 문제가 있습니다. "- D. Tilbrook;) – jfs

+2

@ J.F, 그건 그냥 말도 안돼. – ghostdog74

+0

@ronys, awk는 텍스트 처리만을위한 것이 아닙니다. 당신은 프로그래밍 언어로 그것을 사용할 수 있습니다. – ghostdog74

3

단순한 스팀 편집을하기 위해서 sed는 대부분의 * nix 박스에 표준으로 제공되는 훌륭한 유틸리티이지만, 그보다 훨씬 복잡한 것이면 Perl에 들어갈 것을 제안합니다. 커브가 그렇게 나쁘지는 않으며 대부분의 일반 텍스트 구문 분석 양식을 작성하는 데 적합합니다. 좋은 참고 자료는 here입니다.

1
#!/usr/bin/env python 
# process.py  
import fileinput 

for line in fileinput.input(): # you could use `inplace=True` parameter here 
    words = line.split() # e.g. split on white spaces 
    all_except_last = words[:-1] 
    print ' '.join(all_except_last) 
    # or 
    first_two = words[:2] 
    print ' '.join(first_two) 

예 : 등등 awk/grep/tail/head/sed 같은

$ echo a b c | python process.py 
$ ./process.py input.txt another.txt 
+1

'perl -lane '$, = ""pop @ F; print @ F'' 또는'perl -lane'$, = ""print @ F [0,1] '' –

+0

@Hynek -Pichi- Vychodil : 약간의 실험을 해보십시오 : Perl과 Python 버전을 모르는 사람에게 보여주고이 스크립트가하는 일을 물어보십시오. 그리고 저는 J (수학적인 것들)를 제외하고는 Perl의 한 줄짜리를 간결하게합니다. – jfs

1

* nix에서 스크립트 도구는 좋은 파일 처리 도구입니다. 파일에서 패턴을 검색하여 처리하려는 경우 awk를 사용할 수 있습니다. 대용량 파일의 경우 grep + awk 조합을 사용할 수 있습니다. Grep은 패턴 검색에서 속도를, awk는 텍스트를 조작 할 수있는 능력을 제공합니다. sed와 관련해서는 sed가하는 일을 awk가 이미 처리 할 수 ​​있으므로 파일 처리를 위해 sed를 사용하는 것이 중복됨을 알았습니다.

파일 처리 속도면에서 awk는 종종 Perl 또는 Perl이나 다른 언어보다 나은 경우가 있습니다.

또한 파일 FAST의 앞뒤 부분을 가져 오는 2 가지 도구는 tailhead입니다. 마지막 줄을 찾으려면 tail을 사용할 수 있습니다.

+1

"토큰"에 의해 OP는 파일의 줄이 아니라 줄에있는 항목을 의미하므로 'tail'은이 경우에 적용되지 않습니다. 반면에 '잘라 내기'는 ... –

0

최상의 도구는 수행 할 작업에 따라 다릅니다. sed/awk 및 프로그래밍 언어 (Perl, Python)와 같은 일반 * nix 도구 옆에있는 다른 사람들이 인용 한 텍스트 처리를 위해 현재 원본 데이터 형식이 엄격한 구문 분석 규칙을 따르지 않지만 약간 다를 수있는 곳이 필요합니다. Vim 매크로와 Vim 스크립트 내에서 호출하는 Vimscript 함수들에 매우 잘 맞는다.

다음과 같은 형식 (Vim은 초기화되지 않음) : 처리 함수를 작성합니다 (예 : 파일 script.vim에 TxtProcessingToBeDone1()와 소스를 : 소스 script.vim 다음 편집 할 파일 (들) 및 열 : 전체 버퍼에서에 TxtProcessingToBeDone1()를 호출

:

을 @ : 및 @@ 키를 사용하여 한 번 또는 한 번만 작업하여 현장에서 반복 할 수 있습니다. 또한 여러 버퍼/파일을 동시에 처리 할 수 ​​있습니다 : bufdo 및 : argdo.

Vimscript 기능을 사용하면 일반 편집 세션 (패턴 검색, reg-ex, 대체, 이동, 삭제, 홱 잡아 당기기 등)에서 수행 할 모든 작업을 반복하고 자동화하고 적용 할 수 있습니다 어떤 프로그래밍 제어 흐름 (if/then).

비슷한 고급 고려 사항이 다른 고급 스크립트 작성 가능 편집기에도 적용됩니다.

관련 문제