내 출력 파일에는 다음 내용이 포함되어 있습니다.
출력.txt
2020.11.07-22.3.31 INFO - :|FSNAME:|AVAILABLE:|AVAILABILITY
2020.11.07-22.3.31 INFO - :|/opt:|yes:|1.4GB
2020.11.07-22.3.31 INFO - :|/data:|yes:|30GB
위의 값은 output.txt
해당 변수에서 더해져서 출력되는 크기가 달라지고 글자에만 국한할 수는 없습니다.
column
설치 명령이 없습니다 miller
!
다음 방법을 사용했는데 출력이 순서대로 되지 않습니다
awk '{ gsub(":", " " ) } 1' output.txt
2020.11.07-22.3.31 INFO - |FSNAME |AVAILABLE |AVAILABILITY 2020.11.07-22.3.31 INFO - |/opt |yes |1.4GB 2020.11.07-22.3.31 INFO - |/data |yes |30GB
awk -F ':' '{printf "%-10s%-10s%-10s%-10s\n", $1,$2,$3,$4}' output.txt
2020.11.07-22.3.31 INFO - |FSNAME |AVAILABLE|AVAILABILITY 2020.11.07-22.3.31 INFO - |/opt |yes |1.4GB 2020.11.07-22.3.31 INFO - |/data |yes |30GB
가변 크기 중 하나를 출력 파일에 쓰는 데 10초 이상이 걸리는 경우 아래와 같이 형식이 올바르지 않습니다.
출력.txt
2020.11.07-22.3.31 INFO - :|FSNAME:|AVAILABLE:|AVAILABILITY
2020.11.07-22.3.31 INFO - :|/opt:|yessssssss:|1.4GB
2020.11.07-22.3.31 INFO - :|/data:|yes:|30GB
awk -F ':' '{printf "%-10s%-10s%-10s%-10s\n", $1,$2,$3,$4}' output.txt
2020.11.07-22.3.31 INFO - |FSNAME |AVAILABLE|AVAILABILITY
2020.11.07-22.3.31 INFO - |/opt |yessssssss|1.4GB
2020.11.07-22.3.31 INFO - |/data |yes |30GB
문제를 해결하는 데 도움을 주세요.
답변1
다음 2단계 방법은 필드의 형식을 고정된 열 너비로 지정해야 합니다.
awk -F':\\|' -v OFS='|' 'NR==FNR{for (i=1;i<=NF;i++) {if (length($i)>max[i]) max[i]=length($i);} next;}
{for (i=1;i<=NF;i++) $i=sprintf("%-*s",max[i],$i)}1' output.txt output.txt
이것이 처리할 것이다output.txt
두 배(그래서 인수로 두 번 지정해야 합니다 awk
.)
- 첫 번째 단계(
FNR
파일별 라인 카운터가 글로벌 라인 카운터와 동일함 )에서는 단순히 각 필드 항목의 최대 길이를 찾아( ~에서 모든 필드를NR
반복하여 ) 배열에 저장합니다 .$1
$NF
max
sprintf
두 번째 패스에서는 최대 필드 너비 배열을 기반으로 결정된 고정 너비 로 필드의 형식을 (다시) 지정합니다 .max
- 입력된 필드 구분 기호는 결합 문자 시퀀스로 처리됩니다
:|
(다중 문자이기 때문에 적절한 이스케이프 사용).입력하다필드 구분 기호는 정규식으로 처리되며|
특별한 의미를 갖습니다. 출력 필드 구분 기호는 Single 로 설정됩니다|
.
귀하의 예의 결과
2020.11.07-22.3.31 INFO - |FSNAME|AVAILABLE|AVAILABILITY
2020.11.07-22.3.31 INFO - |/opt |yes |1.4GB
2020.11.07-22.3.31 INFO - |/data |yes |30GB