これを使用して、stat
認証情報を2つの形式で表示する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
上記は、最後の列が常に左揃えであると仮定しています。そうでない場合は、どちらの作業も難しくありませんので、お知らせください。また、入力の最後の行にあるフィールドの値(数値または数値ではない)によって列の並べ替えが決定される可能性があるとします。
入力がファイルではなくパイプから出る必要がある場合(したがって入力を2回開くことはできません)、入力を配列に保存して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