파일의 모든 열을 특정 길이로 자르는 방법은 무엇입니까?

파일의 모든 열을 특정 길이로 자르는 방법은 무엇입니까?

특정 문자로 구분된 파일의 열 형식 텍스트가 있는 경우 특정 열 또는 모든 열의 너비를 자르려면 어떻게 해야 합니까?

사용 사례는 공백으로 구분된 열이 있는 일부 로그 파일을 읽는 것입니다. 로그의 일부 열은 매우 긴 URL이므로 파일을 읽기가 어렵습니다. 저는 URL의 전체 내용에 별로 관심이 없으므로 이러한 열의 길이를 좀 더 읽기 쉽게 잘라내고 싶습니다.

자를 특정 열을 지정하는 방법을 알고 싶지만 실제로는 길이가 N보다 큰 모든 열을 자르는 방법만 알아내면 됩니다.

지금까지 나는 utils 및 utils 를 찾았는데 column모두 colrm이것 cut과 비슷해 보이지만 내 요구 사항을 충족하는 것은 없습니다.

sed(이상적으로는 이미 이 작업을 수행한 컴파일된 유틸리티가 있으면 가장 좋지만 , , 등을 awk사용 하여 이를 수행할 수 있는 방법도 찾고 싶습니다 .)perl

답변1

sed 's/\([^,]\{0,3\}\)[^,]*/\1/g'각 열은 처음 3자로 잘립니다. 열은 "," 문자로 구분됩니다.

작동 방식:

  1. (탐욕스럽게) 0~3개의 문자(',' 제외)로 구성된 문자열을 찾아 이를 첫 번째 그룹(\1로 참조)으로 기억합니다.

  2. 그런 다음 "," 이외의 가능한 많은 문자를 찾으려고 시도합니다.

  3. 이들 모두는 그룹 1(즉, 처음 3개 문자)로 대체됩니다.

  4. 옵션 으로 인해 g이 작업을 행당 여러 번 수행하여 첫 번째 열뿐만 아니라 모든 열을 자릅니다.

편집하다:

의견에서 지적했듯이 ([^,]\{3\}\). 이런 식으로 우리는 단지 일치합니다정확히3자. 그보다 작으면 필드를 자를 필요가 없으므로 상관하지 않습니다. 따라서 최종 명령은 다음과 같습니다.

`sed 's/\([^,]\{3\}\)[^,]*/\1/g'`

답변2

긴 URL 때문에 짜증이 난다고 썼기 때문에 파일의 열별 구조는 중요하지 않다고 상상할 수 있습니다. 적어도 파일을 보는 대신 파일을 구문 분석하는 경우에는 그렇습니다.

이 경우 내 솔루션은

perl -pe 's%(http://\S+)%substr($1, 0, 15)%ge' <file_with_long_urls> | column -t

이렇게 하면 URL에서 15번째 문자 이후의 모든 문자가 제거됩니다 http://.

열이 공백이 아닌 문자 &(임의 구분 기호를 나타냄)로 구분된 경우 내 솔루션은 다음과 같습니다.

perl -pe 's%(http://\S+?)(?=&|$)%substr($1, 0, 15)%ge' <file_with_long_urls> | column -s '&' -t

어쩌면 이것을 사용할 수도 있습니다! ?

관련 정보