awk 및 printf 열의 형식을 지정하고 9번째 이후의 모든 열을 포함하는 방법

awk 및 printf 열의 형식을 지정하고 9번째 이후의 모든 열을 포함하는 방법

첫 번째 열부터 9번째 열까지 지정된 모든 열을 인쇄하기 위해 printf를 사용하여 형식화된 다음 스크립트가 있지만 9번째 열 이후의 모든 열을 인쇄하고 싶은데 어떻게 해야 할지 모르겠습니다.

pwd=`pwd`
#Megabytes
max_size_1=`ls -ltr "$pwd" | grep -v "total" | awk '{print $1}' | sort -n | tail -1 | wc -m`
max_size_2=`ls -ltr "$pwd" | grep -v "total" | awk '{print $2}' | sort -n | tail -1 | wc -m`
max_size_3=`ls -ltr "$pwd" | grep -v "total" | awk '{print $3}' | sort -n | tail -1 | wc -m`
max_size_4=`ls -ltr "$pwd" | grep -v "total" | awk '{print $4}' | sort -n | tail -1 | wc -m`
max_size_5=`ls -ltr "$pwd" | grep -v "total" | awk '{$5=sprintf("%.0f M", $5/1024^2)} 1' | awk '{print $5}' | sort -n | tail -1 | wc -m`


ls -ltr "$pwd" | grep -v "total" | awk '{$5=sprintf("%.0f M", $5/1024^2)} 1' | eval "awk '{printf \"%$max_size_1-s %$max_size_2-s %$max_size_3-s %$max_size_4-s %$max_size_5-s %-3s %-3s %-3s %-6s\\n\", \$1, \$2, \$3, \$4, \$5, \$6, \$7, \$8, \$9}'"

출력은 다음과 같습니다

-rwxr-xr-x  1  informix  informix  0  M   Mar 1   13:45 
-rwxr-xr-x  1  informix  informix  0  M   Mar 1   13:45 
-rwxr-xr-x  1  informix  informix  0  M   Mar 1   13:46 
-rwxr-xr-x  1  informix  informix  0  M   Mar 9   10:51 
-rw-r-----  1  informix  informix  0  M   Mar 9   12:36 
-rwxrwxrwx  1  informix  informix  0  M   Mar 9   13:01

내가 원하는 것:

-rwxr-xr-x  1  informix  informix  0  M   Mar 1   13:45 ls-ltrg
-rwxr-xr-x  1  informix  informix  0  M   Mar 1   13:45 ls-ltrk
-rwxr-xr-x  1  informix  informix  0  M   Mar 1   13:46 ls-ltrb
-rwxr-xr-x  1  informix  informix  0  M   Mar 9   10:51 ls-ltrm
-rw-r-----  1  informix  informix  0  M   Mar 9   12:36 split word
-rwxrwxrwx  1  informix  informix  0  M   Mar 9   13:01 test.sh

분할 후 9개의 짝수 파일 또는 이름 이후의 모든 열을 인쇄해야 합니다.

답변1

나는 이것이 주로 awk를 배울 수 있는 기회로서 흥미로운 질문이라고 생각했습니다.

ls를 구문 분석하다꾸준함 예교활한그리고 이는 권장되지 않으므로 여기서는 자세한 내용을 다루지 않겠습니다. 파일 이름에 개행 문자가 전혀 포함되어 있지 않으면 다음 awk 스크립트를 사용하여 별도의 섹션에서 수행하는 모든 작업을 수행할 수 있습니다.

  • "합계" 행 찾기
  • 각 필드의 길이를 가져옵니다.
  • 동적으로 열 형식 지정

...ls, grep, awk, sort, tail 및 wc를 여러 번 호출하지 않고도 모두 가능합니다.그리고사용할 필요가 없습니다 eval.

현재 디렉터리( )가 기본적으로 나열 되므로 ls해당 디렉터리도 제거했습니다.pwd

임의의 메모:

  • 처음 사용할 때 0으로 awk초기화하지 않아서 iBEGIN 블록에서 강제로 0으로 설정했습니다.

  • grep -v total부분은 한 줄로 이루어집니다./^total / { next; }

  • 이것실제당신의 해결실제문제는 for파일 이름 정보를 열 9..NF에 병합하는 루프에 있습니다.

  • 형식은 두 부분으로 나뉩니다. forEND 블록의 첫 번째 루프는 필요한 너비를 결정합니다. 두 번째 for루프는 *형식 지정자를 사용하여 실제 값 앞에 필요한 너비를 전달하여 실제 작업을 수행합니다.

생성된 스크립트/코드는 다음과 같습니다.

ls -ltr | awk '
        BEGIN {
                i=0;
        }

        /^total / { next; }
        {
                perms[i]=$1
                links[i]=$2
                owner[i]=$3
                group[i]=$4
                $5=sprintf("%.0f M", $5/1024^2)
                size[i]=$5
                date[i]=$6 " " $7 " " $8
                for(x=9; x <= NF; x++) name[i] = name[i] " " $x
                i++
        }

        END {
                for(j=0;j<i;j++) {
                        if (length(perms[j]) > maxperms) maxperms = length(perms[j])
                        if (length(links[j]) > maxlinks) maxlinks = length(links[j])
                        if (length(owner[j]) > maxowner) maxowner = length(owner[j])
                        if (length(group[j]) > maxgroup) maxgroup = length(group[j])
                        if (length(size[j]) > maxsize) maxsize = length(size[j])
                }
                for(j=0;j<i;j++) {
                        printf "%-*s %-*s %-*s %-*s %-*s %s %s\n",
                                maxperms, perms[j],
                                maxlinks, links[j],
                                maxowner, owner[j],
                                maxgroup, group[j],
                                maxsize, size[j],
                                date[j],
                                name[j]
                }
        }
        '

제가 사용할 수 있도록 준비된 치트 시트를 제공해주신 G-Man에게 큰 감사를 드립니다.awk의 동적 열 형식.

관련 정보