이것은 내 파일입니다:
TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y
TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y
TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y
TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y
TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y
TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y
TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y
TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y
TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y
TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y
TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y
TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y
숫자 10 이후부터 시작하는 행에 정렬 문제가 있습니다. 아래에 언급된 형식을 원합니다.
TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y
TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y
TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y
TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y
TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y
TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y
TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y
TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y
TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y
TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y
TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y
TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y
답변1
작업에 적합한 도구는 다음과 같이 (OS X에서 )을 사용하여 열 구분 기호를 지정할 column
수 있습니다 .-o
-s
column -t -o ' ' file
주어진
TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y
TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y
TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y
TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y
TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y
TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y
TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y
TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y
TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y
TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y
TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y
TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y
답변2
이 특별한 경우에는 두 개 이상의 공백을 모두 탭으로 간단히 변경하는 것으로 충분합니다.
sed 's/ */\t/g' file
보다 일반적인 해결 방법을 사용하면 각 열이 올바른 너비로 인쇄되도록 할 수 있습니다 printf
. 셸에서 직접 이 작업을 수행할 수 있습니다.
$ while read line; do
printf '%-8s%-6s%-7s%-3s%-8s%-3s%-7s%-2s%-2s\n' $line;
done < file
TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y
TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y
TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y
TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y
TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y
TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y
TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y
TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y
TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y
TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y
TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y
TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y
또는 임의 입력에 대해 더 안전합니다.
$ while read a b c d e f g h i; do
printf '%-8s%-6s%-7s%-3s%-8s%-3s%-7s%-2s%-2s\n' "$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h" "$i";
done < file
TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y
TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y
TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y
TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y
TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y
TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y
TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y
TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y
TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y
TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y
TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y
TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y
다음을 사용하면 더 빠르고 간결하게 이 작업을 수행할 수 있습니다 perl
.
$ perl -lane 'printf "%-8s%-6s%-7s%-3s%-8s%-3s%-7s%-2s%-2s\n",@F' file
TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y
TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y
TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y
TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y
TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y
TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y
TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y
TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y
TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y
TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y
TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y
TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y
printf
이를 사용하면 각 열의 최소 열 너비를 지정할 수 있다는 장점이 있습니다. 이는 열 중 하나가 더 긴 값을 가질 수 있어도 여전히 작동한다는 것을 의미합니다. 예를 들어 행 중 하나의 첫 번째 필드가 이면 averylongfieldindeed
첫 번째 열의 최소 너비를 21로 설정하고 출력을 정렬할 수 있습니다.
$ perl -lane 'printf "%-21s%-6s%-7s%-3s%-8s%-3s%-7s%-2s%-2s\n",@F' file
averylongfieldindeed CBdms Status DP 6/1/1 DC 6/1/5 0 Y
TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y
TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y
TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y
TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y
TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y
TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y
TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y
TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y
TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y
TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y
TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y
반대로 탭을 사용하면 작동하지 않습니다.
$ sed -e "s/\s\+/\t/g" file
averylongfieldindeed CBdms Status DP 6/1/1 DC 6/1/5 0 Y
TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y
TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y
TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y
TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y
TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y
TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y
TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y
TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y
TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y
TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y
TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y
답변3
이 sed 명령은 주어진 출력을 수정합니다.
sed 's=\(D[CP] *./../.\) =\1=g'
./../.
DC 및 DP 뒤에 공백을 제거합니다. 다른 숫자도 길어질 수 있다면 sed가 해당 작업에 적합한 도구가 아닐 수 있습니다.
답변4
매우 간단한 명령이 있습니다.
tr -s ' ' <input-file >output-file
-s
옵션은 다음 항목 <space>
(또는 명령줄에서 그 뒤에 오는 모든 문자) 을 제거합니다.