현재 유닉스에서 두 파일을 병합하려고 합니다.
첫 번째 파일:
Tom 313.455.6786
Deena 313.899.7400
Will 313.845.5633
Nancy 313.676.9445
Kelly 313.611.4242
John 313.908.3858
두 번째 파일:
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
(그렇지 않으면 더 복잡한 프로그램이 필요합니다).