특정 문자로 구분된 파일의 열 형식 텍스트가 있는 경우 특정 열 또는 모든 열의 너비를 자르려면 어떻게 해야 합니까?
사용 사례는 공백으로 구분된 열이 있는 일부 로그 파일을 읽는 것입니다. 로그의 일부 열은 매우 긴 URL이므로 파일을 읽기가 어렵습니다. 저는 URL의 전체 내용에 별로 관심이 없으므로 이러한 열의 길이를 좀 더 읽기 쉽게 잘라내고 싶습니다.
자를 특정 열을 지정하는 방법을 알고 싶지만 실제로는 길이가 N보다 큰 모든 열을 자르는 방법만 알아내면 됩니다.
지금까지 나는 utils 및 utils 를 찾았는데 column
모두 colrm
이것 cut
과 비슷해 보이지만 내 요구 사항을 충족하는 것은 없습니다.
sed
(이상적으로는 이미 이 작업을 수행한 컴파일된 유틸리티가 있으면 가장 좋지만 , , 등을 awk
사용 하여 이를 수행할 수 있는 방법도 찾고 싶습니다 .)perl
답변1
sed 's/\([^,]\{0,3\}\)[^,]*/\1/g'
각 열은 처음 3자로 잘립니다. 열은 "," 문자로 구분됩니다.
작동 방식:
(탐욕스럽게) 0~3개의 문자(',' 제외)로 구성된 문자열을 찾아 이를 첫 번째 그룹(\1로 참조)으로 기억합니다.
그런 다음 "," 이외의 가능한 많은 문자를 찾으려고 시도합니다.
이들 모두는 그룹 1(즉, 처음 3개 문자)로 대체됩니다.
옵션 으로 인해
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
어쩌면 이것을 사용할 수도 있습니다! ?