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部分は1行で構成されています。/^total / { next; }

  • これ実際あなたの解決実際問題は、forファイル名情報を9..NF列にマージするループにあります。

  • フォーマットは2つの部分に分けられます。forENDブロックの最初のループは必要な幅を決定します。 2 番目の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の動的列形式

おすすめ記事