쉼표로 구분된 텍스트 줄을 일부 열이 오른쪽 정렬된 열로 분할하는 쉬운 방법이 있습니까?
보너스로 숫자 형식을 지정하면 좋겠지만 sed에서는 그다지 어렵지 않을 것입니다.
답변1
앗%42s
나는 printf 형식을 생각했습니다. 시작하기 위한 간단한 스크립트는 다음과 같습니다. 절에 width[i]
양수 값을 설정하면 BEGIN
열이 지정된 너비(왼쪽 정렬)를 갖게 됩니다. 음수 인 경우 width[i]
열은 i
오른쪽 정렬되고 너비는 입니다 -width[i]
. 스크립트는 넓은 필드를 지능적으로 처리하지 않으며 모든 후속 열은 행의 오른쪽으로 이동합니다.
awk -F, -vOFS= '
BEGIN {width[1]=-10; width[2]=8;}
{ for (i=1; i<=NF; i++) {$i = sprintf("%*s", width[i], $i)}
print }'
숫자 필드가 있는 경우 추가 필드를 사용할 수 있습니다.printf 형식.
BSD 유틸리티가 있는 경우column
(Debian에서 제공하지만 다른 Linux 배포판에 대해서는 모르겠습니다.) 쉽게 사용할 수 있습니다 column -t -s ,
. 이점은 column
열 너비를 자동으로 결정한다는 것입니다. 그러나 약간의 후처리를 통해 얻을 수는 있지만 복잡성이 그만한 가치가 있는지는 모르겠습니다.
Perl로 모든 것을 할 수 있습니다. 그것은체재시설이 도움이 될 수 있습니다.
일반적인 UNIX 도구를 사용하여 테이블 형식을 지정하는 보다 강력한 방법은 다음과 같습니다.tbl
, 이는 *roff(man 페이지 포맷터) 처리 테이블의 일부입니다. 그러나 입력을 roff로 변환해야 하기 때문에 더 복잡하기도 합니다.
또 다른 가능한 도구는 텍스트 모드 브라우저입니다.w3m, 테이블 렌더링에 능숙합니다. 여기서 입력을 HTML로 변환해야 합니다.
답변2
결국 제가 직접 문제를 해결했습니다. 대신 을 column
사용하여 awk
열을 생성하세요. 예를 들어 foo.txt에 "bar,36,17.34566" 형식의 줄이 있으면 다음과 같이 할 수 있습니다.
cat foo.txt | awk -F, '{printf "%-20s %20d %20.2f\n", $1, $2, $3 }'
첫 번째 열은 왼쪽 맞춤, 나머지 두 열은 오른쪽 맞춤, 마지막 열의 정밀도는 소수점 이하 두 자리로, 너비가 20인 열을 생성합니다.
답변3
내 파이프라인:
| nl -nrz\
| rev\
| column -t\
| rev\
| cut -d' ' -f2-
- 고정 너비 접두사 열 추가
- 문자열의 역방향 문자
- 열을 왼쪽으로 정렬
- 문자열의 역방향 문자
- #1에 추가된 열을 제거합니다.