목록을 특정 문자와 정렬하는 방법은 무엇입니까?

목록을 특정 문자와 정렬하는 방법은 무엇입니까?

임의의 문자가 포함된 텍스트 줄을 가로로 정렬하는 데 사용할 수 있는 명령 또는 명령 집합이 있습니까? 예를 들어 이메일 주소 목록의 경우 출력에서는 모든 "@" 문자가 세로로 정렬된 텍스트 파일을 생성합니다.

성공하려면 대부분의 줄 시작 부분에 가변적인 양의 공백을 추가해야 한다고 생각합니다. 읽는 데 더 많은 노력이 필요하기 때문에 별도의 열을 원하지 않습니다(예: column -t -s "@" < file.txt).

앞으로:

[email protected]
[email protected]
[email protected]

뒤쪽에:

   [email protected]
[email protected]
 [email protected]

즉, 문자를 앵커 포인트로 지정하고 주변 텍스트를 해당 앵커 포인트를 중심으로 수평 중앙에 배치할 수 있습니까? 내 사용 사례는 시각적 스캔을 더 쉽게 하기 위한 이메일 주소입니다.

답변1

가장 간단하게는 첫 번째 필드를 적절하게 넓은 필드 너비로 인쇄할 수 있습니다.

awk -F@ 'BEGIN{OFS=FS} {$1 = sprintf("%12s", $1)} 1' file
         [email protected]
      [email protected]
       [email protected]

내가 아는 한, 특정 최대 필드 너비를 가정하지 않는 방법은 파일을 메모리에 유지하거나 두 번의 패스를 수행해야 합니다.

답변2

해키 솔루션은 입력 텍스트에 대해 많은 가정을 합니다.

$ # four commas to reduce chance of it affecting actual email address
$ sed 's/@/,,,,@/' ip.txt | column -t -s,,,,
123     @example.com
456789  @example.net
01234   @something-else.com

$ sed 's/@/,,,,@/' ip.txt | column -t -s,,,, | sed -E 's/^([^ ]+)( +)/\2\1/'
     [email protected]
  [email protected]
   [email protected]

답변3

가능한 가장 짧은 패딩 길이를 사용하여 구분 기호 왼쪽에 있는 모든 문자열을 오른쪽 정렬하는 빠른 Python 솔루션:

#!/usr/bin/env python3
import sys
fieldsep = '@'
records = [line.rstrip('\n').split(fieldsep, 1) for line in sys.stdin]
col1_len = max((len(r[0]) for r in records), default=0)
for r in records:
    print(r[0].rjust(col1_len), r[1], sep=fieldsep)

용법:

python3 align-field.py < data.txt

답변4

또 다른 GNUawk+column해결책:

awk '{ split($0,a,/ +/,sep); printf "%*s@%s\n",length($1 sep[1])-2,$1,$2 }' <(column -ts'@' file)

산출:

   [email protected]
[email protected]
 [email protected]

관련 정보