最初の列から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
初期化せず、i
BEGINブロックで強制的に0に設定しました。この
grep -v total
部分は1行で構成されています。/^total / { next; }
これ実際あなたの解決実際問題は、
for
ファイル名情報を9..NF列にマージするループにあります。フォーマットは2つの部分に分けられます。
for
ENDブロックの最初のループは必要な幅を決定します。 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の動的列形式。