
テーブル形式のファイルから情報を印刷しようとしています。今まで
BEGIN {
OFS = "\t";
FS = ":";
print "\t\t----Employee Information---- ";
printf("%s %40s %20s %4s %8s %4s %15s \n", "NAME", "TELEPHONE", "AGE", "|", "Salary", "|", "License No.")
}
{ printf ("%s %30s %30s %30s %30s\n", $4, $1, $5, $2, $3) }
列を管理していますが、データを好きなように整理できないようです。
以下は、出力する必要があるデータの例です。
{246} 548-1278:2500:175A106:Miss Cherise Hilton-Moore : 30
{408} 538-2358:1550:201B154:Mr Reynold Watson :37
{210} 655-6279:2600:509UYT6:Miss Natalie Judy-Sealy :32
{210} 548-1348:2500:175XCVD3:Mr John McCollin : 26
{208} 548-1278:1880:150P9URE:Mr Ronald Francis: 31
順番に地域番号、電話番号、給与、ライセンス番号、名前、年齢順です。列の下に並べ替えたいです。
Name Telephone Age Salary License Number.
しかし、私が得た結果は次のとおりです。
NAME TELEPHONE AGE | Salary | License No.
Miss Cherise Hilton-Moore {246} 548-1278 30 2500 175A106
Mr Reynold Watson {408} 538-2358 37 1550 201B154
Miss Natalie Judy-Sealy {210} 655-6279 32 2600 509UYT6
編集者:まず、指導してくれた皆さんに感謝します。これが私が今まで持っているものです:
BEGIN {FS = ":";
print "\t\t----Employee Information---- ";
printf("%s %40s %20s %4s %8s %4s %15s \n", "NAME", "TELEPHONE", "AGE", "|", "Salary", "|", "License No.")}\
{printf ("%-35s %-26s %-10s %-15s %-10s\n", $4, $1, $5, $2, $3)}
#End of Script
一般的に動作するとは言いません。探し続けますが、これは私の指定者の理解に基づいています。
答え1
$ cat tst.awk
BEGIN {
ARGV[ARGC] = ARGV[ARGC-1] # So we can read the input twice, first to get the max field widths.
ARGC++
# Not using character class [:blank:] because nawk does not support character classes
FS = "[ \t]*:[ \t]*"
split("TELEPHONE:SALARY:LICENSE NO.:NAME:AGE",inNr2Name)
for (inNr in inNr2Name) {
name = inNr2Name[inNr]
wid = length(name)
name2wid[name] = wid
f[name] = inNr # field name to input field number
}
print "\t\t----Employee Information---- "
}
NR==FNR {
for (inNr=1; inNr<=NF; inNr++) {
name = inNr2Name[inNr]
val = $inNr
wid = length(val)
name2wid[name] = (name2wid[name] > wid ? name2wid[name] : wid)
}
next
}
FNR == 1 {
outFmt = "%-" name2wid["NAME"] "s " \
"%-" name2wid["TELEPHONE"] "s " \
"%-" name2wid["AGE"] "s " \
"| " \
"%-" name2wid["SALARY"] "s " \
"| " \
"%-" name2wid["LICENSE NO."] "s\n"
printf outFmt, "NAME", "TELEPHONE", "AGE", "SALARY", "LICENSE NO."
}
{
printf outFmt, $(f["NAME"]), $(f["TELEPHONE"]), $(f["AGE"]), $(f["SALARY"]), $(f["LICENSE NO."])
}
$ awk -f tst.awk file
----Employee Information----
NAME TELEPHONE AGE | SALARY | LICENSE NO.
Miss Cherise Hilton-Moore {246} 548-1278 30 | 2500 | 175A106
Mr Reynold Watson {408} 538-2358 37 | 1550 | 201B154
Miss Natalie Judy-Sealy {210} 655-6279 32 | 2600 | 509UYT6
Mr John McCollin {210} 548-1348 26 | 2500 | 175XCVD3
Mr Ronald Francis {208} 548-1278 31 | 1880 | 150P9URE
私はすべて意味のある名前を持つ多くの中間変数を使用しています。したがって、あなたがしばらく考えて、マニュアルページを見た後、これが何をしているのかを理解してください。しかし、そうでない場合は、自由に質問してください。