kornシェルから特定の出力を取得するために2つのファイルをマージするスクリプトを書く方法は? [コピー]

kornシェルから特定の出力を取得するために2つのファイルをマージするスクリプトを書く方法は? [コピー]

現在、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(そうでない場合は、より複雑なプログラムが必要です)。

おすすめ記事