![kornシェルから特定の出力を取得するために2つのファイルをマージするスクリプトを書く方法は? [コピー]](https://linux33.com/image/63791/korn%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%8B%E3%82%89%E7%89%B9%E5%AE%9A%E3%81%AE%E5%87%BA%E5%8A%9B%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB2%E3%81%A4%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%9E%E3%83%BC%E3%82%B8%E3%81%99%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E6%9B%B8%E3%81%8F%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
現在、Unixで2つのファイルをマージしようとしています。
最初のファイル:
Tom 313.455.6786
Deena 313.899.7400
Will 313.845.5633
Nancy 313.676.9445
Kelly 313.611.4242
John 313.908.3858
2番目のファイル:
Deena Tuesday
Will Monday
Kelly Sunday
John Wednesday
Tom Thursday
Nancy Saturday
私はkornシェルでスクリプトを書いており、forループと配列とすべてのジャズを含める必要があります。
これが私が今まで持っているものです:
#!/bin/ksh
file1=/home/file1
file2=/home/file2
set -A name
set -A phone
set -A day
for input in `cat file1| cut -d " " -f1`
do
name=$input
done
for input2 in `cat file1|cut -d " " -f2`
do
phone=$input2
done
for input3 in `cat file2|cut -d " " -f2`
do day=$input3
week= "Monday Tuesday Wednesday Thursday Friday Saturday Sunday"
for day in $week
do
echo $day\n
day=$i
done
done
printf "%s\t%-12s\t%s\n" "Name" "On-Call" "Phone"; join < (sort file1) <
(sort file2) | tr ' ' '\t'
このスクリプトは次の結果を提供します。
Name On-Call Phone
Deena 313.899.7400 Tuesday
John 313.908.3858 Wednesday
Kelly 313.611.4242 Sunday
Nancy 313.676.9445 Saturday
Tom 313.455.6786 Thursday
Will 313.845.56334 Monday
このコードは、平日ではなく名前に基づいてアルファベット順にファイルをソートします。これがまさに私が必要なものです。また、通話中の出力と電話出力を反転します。
次のように表示するには、最終ファイルが必要です。
Name On-Call Phone
Will Monday 313.845.5633
Deena Tuesday 313.899.7400
John Wednesday 313.908.3858
Tom Thursday 313.455.6786
Nobody Friday 313.555.3454
Nancy Saturday 313.676.9445
Kelly Sunday 313.611.4242
答え1
これを使用するのはawk
シェルを使用するよりも簡単です。
awk '
BEGIN { fmt = "%-8s%-11s%s\n" ; printf fmt, "Name", "On-Call", "Phone" }
NR==FNR { a[$1] = $2 ; next }
{ printf fmt, $1, $2, a[$1] }
' firstfile secondfile
(このプログラムはKornshellから呼び出すことができます。)
注:出力レコードの順序はのレコード順序と一致しますsecondfile
。したがって、レコードを平日で並べ替えるには、レコードの順序を調整しますsecondfile
(そうでない場合は、より複雑なプログラムが必要です)。