2008-09-17 3 views
0

다양한 형식의 텍스트 파일로 텍스트 파일을 처리해야합니다. 여기서 일례이다 (열 가 탭 구분되는 및 B) 방식을 구분 혼합 한cygwin에서 명령 행 파일 구문 분석 도구

A B 
a Name1=Val1, Name2=Val2, Name3=Val3 
b Name1=Val4, Name3=Val5 
c Name1=Val6, Name2=Val7, Name3=Val8 

파일이 헤더가 없거나 수는
등 위와 같이 이름/값 쌍으로 열이 필자는 종종 이러한 파일에서 다양한 방법으로 데이터를 추출해야하는 임시적인 필요성을 가지고 있습니다. 예를 들어 위의 데이터에서 Name2와 관련된 값을 원할 수 있습니다. 즉

A B 
a Val2 
c Val7 

위의 예를 사용하여 다른 사례로 확장 할 수있는 한 줄 명령처럼 어떤 도구/기술이 있습니까?

답변

1

너무 많이 나오지도 좋아하지 않지만, 그러한 것들에 대한 작동합니다

var="Name2";sed -n "1p;s/\([^ ]*\) .*$var=\([^ ,]*\).*/\1 \2/p" < filename 

당신에게 제공합니다 :

A B 
a Val2 
c Val7 
1

모든 기본 bash 쉘 명령 (예 : grep, cut, sed 및 awk)을 임의로 사용할 수 있습니다. 보다 복잡한 작업을 위해 Perl이나 Ruby를 사용할 수도 있습니다.

0

내가 봤던 것에서 나는 이런 종류의 일을하기 위해 Awk로 시작했고, 더 복잡한 것을 필요로한다면, 나는 파이썬으로 나아갈 것이다.

0

내가 나오지도 사용합니다 : 당신이 Cygwin에서 가지고 있기 때문에, 나는 펄 갈 것

# print section of file between two regular expressions (inclusive) 
    sed -n '/Iowa/,/Montana/p'    # case sensitive 
0

. 배우기가 가장 쉬우 며 (O'Reily 책을 확인하십시오 : Learning Perl) 널리 적용됩니다.

0

나는 펄을 사용합니다. 다른 형식을 다루기 위해 작은 모듈 (또는 둘 이상)을 작성하십시오. 그런 다음 해당 라이브러리를 사용하여 perl oneliners를 실행할 수 있습니다. 이 다음과 같이 어떻게 보이는지에 대한 예 :

perl -e 'use Parser;' -e 'parser("in.input").get("Name2");' 

구문에 저를 인용하지 마십시오,하지만 일반적인 생각이다. 당신이해야 할 일의 관점에서 생각하게 해주는 작업을 추상적으로 요약하십시오. 어떻게해야하는지 생각하지 마십시오. Ruby는 또 다른 옵션이 될 것이고, 더 명확한 구문을 사용하는 경향이 있지만 어느 언어 든 작동합니다.