Linux에서 간격이 가장 낮은 공통 분모가 되도록 열 탭 크기를 사후 형식화할 수 있습니까?

Linux에서 간격이 가장 낮은 공통 분모가 되도록 열 탭 크기를 사후 형식화할 수 있습니까?

stat두 가지 형식의 권한 정보를 모두 표시하는 ls 출력을 생성하는 데 사용할 수 있습니다 .

stat --printf="%A\t%a\t%h\t%U\t%G\t%s\t%.19y\t%n\n" . .*

drwxr-xr-x      755     4       boss    boss    4096    2021-10-29 22:49:12     .
drwxr-xr-x      755     4       boss    boss    4096    2021-10-29 22:49:12     .
drwxr-xr-x      755     36      boss    boss    4096    2021-11-01 11:30:24     ..
-rw-r--r--      644     1       boss    boss    97708   2021-11-01 11:30:16     .custom
-rw-r--r--      644     1       boss    boss    4013    2021-10-11 22:04:04     .custom-dk

그러나 열 사이의 간격은 \t괜찮지만 꽤 '간격'합니다. 이것은 나를 궁금하게 만들었습니다. 열이 단일 공간 간격의 가장 낮은 공통 분모에 있도록 이와 같은 출력을 사후 처리하는 일반적인 방법이 있습니까? 즉, 위의 내용을 아래와 같이 조정하는 일반적인 방법이 있습니까? awk또는 이와 유사한 것을 사용합니까 sed(가능한 경우 '이상적인' 출력으로 숫자 열만 오른쪽 정렬하고 있습니다)?

drwxr-xr-x 755  4 boss boss  4096 2021-10-29 22:49:12 .
drwxr-xr-x 755  4 boss boss  4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 36 boss boss  4096 2021-11-01 11:30:24 ..
-rw-r--r-- 644  1 boss boss 97708 2021-11-01 11:30:16 .custom
-rw-r--r-- 644  1 boss boss  4013 2021-10-11 22:04:04 .custom-dk

답변1

귀하의 질문에 있는 "또는 sed"와 관련하여 - sed는 개별 문자열에 대한 간단한 s/old/new/ 변환에 사용하는 올바른 도구입니다. 귀하가 하고 있는 일은 그런 것이 아니므로 sed는 옵션이 되어서는 안 됩니다. 고려하다.

2단계 접근 방식을 사용하여 먼저 모든 열의 최대 너비와 정렬을 결정한 다음 모든 Unix 상자의 모든 셸에서 awk를 사용하여 인쇄할 때 이를 사용합니다.

$ cat tst.awk
BEGIN { FS="\t" }
NR==FNR {
    for (i=1; i<=NF; i++) {
        align[i] = ( $i ~ /^[0-9]+$/ ? "" : "-" )
        width[i] = ( length($i) > width[i] ? length($i) : width[i] )
    }
    next
}
{
    for (i=1; i<NF; i++) {
        printf "%" align[i] width[i] "s ", $i
    }
    print $NF
}

$ awk -f tst.awk file file
drwxr-xr-x 755  4 boss boss  4096 2021-10-29 22:49:12 .
drwxr-xr-x 755  4 boss boss  4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 36 boss boss  4096 2021-11-01 11:30:24 ..
-rw-r--r-- 644  1 boss boss 97708 2021-11-01 11:30:16 .custom
-rw-r--r-- 644  1 boss boss  4013 2021-10-11 22:04:04 .custom-dk

위의 내용은 마지막 열이 항상 왼쪽 정렬이라고 가정합니다. 그렇지 않은 경우 어느 쪽이든 처리하기 어렵지 않으니 알려주세요. 또한 입력의 마지막 줄에 있는 필드의 값(숫자 여부)에 따라 열 정렬이 결정될 수 있다고 가정합니다.

입력이 파일 대신 파이프에서 나와야 하는 경우(따라서 입력을 두 번 열 수 없음) 입력을 배열에 저장하고 END 섹션에 인쇄할 수 있습니다.

$ cat tst.awk
BEGIN { FS = "\t" }
{
    for (i=1; i<=NF; i++) {
        width[i] = ( length($i) > width[i] ? length($i) : width[i] )
        align[i] = ( $i ~ /^[0-9]+$/ ? "" : "-" )
        vals[NR,i] = $i
    }
}
END {
    for (n=1; n<=NR; n++) {
        for (i=1; i<NF; i++) {
            printf "%" align[i] width[i] "s ", vals[n,i]
        }
        print vals[n,NF]
    }
}

그런 다음 다음과 같이 호출하십시오.

$ stat --printf="%A\t%a\t%h\t%U\t%G\t%s\t%.19y\t%n\n" . .* | awk -f tst.awk

답변2

사용할 수 있습니다 column -t your_file(그러나 내가 알 수 있는 한 올바른 정렬된 비트를 얻지 못합니다).

출력:

drwxr-xr-x  755  4   boss  boss  4096   2021-10-29  22:49:12  .
drwxr-xr-x  755  4   boss  boss  4096   2021-10-29  22:49:12  .
drwxr-xr-x  755  36  boss  boss  4096   2021-11-01  11:30:24  ..
-rw-r--r--  644  1   boss  boss  97708  2021-11-01  11:30:16  .custom
-rw-r--r--  644  1   boss  boss  4013   2021-10-11  22:04:04  .custom-dk

관련 정보