如何将水平输入更改为垂直输出
How to change horizontal input to vertical output
我正在使用 UNIX Korn shell。我正在尝试在 Unix 中创建一个程序,它将搜索如下所示的文本文件:
Last Name:First Name:City:State:Class:Semester Enrolled:Year First Enrolled
Gilman:Randy:Manhattan:KS:Junior:Spring:2010
Denton:Jacob:Rochester:NY:Senoir:Fall:2009
Goodman:Joshua:Warren:MI:Freshman:Summer:2014
Davidson:Blair:Snohomish:WA:Sophmore:Fall:2013
Anderson:Neo:Seattle:WA:Senoir:Spring:2008
Beckman:John:Ft. Polk:LA:Freshman:Spring:2014
然后把那条线剪下来垂直显示。所以如果我搜索吉尔曼。它会产生:
Gilman
Randy
Manhattan
KS
Junior
Spring
2010
但是包括在内我应该也能够产生以下布局:
Last Name: Gilman
First Name: Randy
City: Manhattan
State: KS
Class: Junior
Semester Enrolled: Spring
Year First Enrolled: 2010
现在我已经弄清楚了其中的大部分内容,我将在下面的代码中显示这些内容:
cat<<MENULIST
A - Add Student Information
D - Delete Student Information
M - Modify Student Information
I - Inquiry on a Student
X - Exit
MENULIST
echo -en '\n'
echo -en '\n'
echo " Pleasa choose one of the following: "
#take input from operation
read choice
case $choice in
a|A) ;;
d|D) ;;
m|M) ;;
i|I)
#Create Inguiry Message
clear
echo " Record Inquiry "
echo -en '\n'
echo -en '\n'
echo "What is the last name of the person"
#Gather search parameter
read last_name
grep -i "$last_name" | cut -f 1-7 -d ':' ;;
x|X) echo "The program is ending" ; exit 0;;
*) echo -en '\n' ;echo "Not an acceptable entry." ;echo "Please press enter to try again"; read JUNK | tee -a ; continue
esac
我真的很难将输入重定向到正确的输出。该程序还有很多内容,但这是该问题的相关部分。任何帮助将不胜感激。
编辑:
好的,最终答案如下图:
while IFS=: read c1 c2 c3 c4 c5 c6 c7 rest ; do
case "$c1" in
"$last_name" )
echo -e "Last Name: $c1\nFirst Name: $c2\nCity: $c3\nState: $c4\nClass: $c5\nSemester Enrolled: $c6\nYear First Enrolled: $c7\n\n"
;;
esac
done <
这正确地执行了预期的结果感谢大家的帮助。我还有一些其他问题,但我会为此创建一个新主题,以免混淆在一起。
这里我 post shell
脚本的替代方案,在 perl:
perl -F':' -lne '
BEGIN { $name = pop; }
$. == 1 and do { @header = @F; next; };
next if m/^\s*$/;
if ( $F[0] eq $name ) {
for ( $i = 0; $i < @F; $i++ ) {
printf qq|%s: %s\n|, $header[$i], $F[$i];
}
exit 0;
}
' infile Gilman
它使用 -F
开关以冒号分隔字段,-l
删除最后一个换行符,-n
打开输入文件并逐行处理。
该脚本接受两个参数,但我在处理之前提取了最后一个参数,假设它是您要搜索的名称。
第一行保存在一个名为 @header
的数组中,对于下一行,它比较第一个字段,并在匹配中打印每个 header 后跟当前行的每个字段并中止程序.
它产生:
Last Name: Gilman
First Name: Randy
City: Manhattan
State: KS
Class: Junior
Semester Enrolled: Spring
Year First Enrolled: 2010
替换你的线路
grep -i "$last_name" | cut -f 1-7 -d ':' ;;
和
awk -F: -vnameMatch="$last_name" \
'==nameMatch{
printf("LastName:%s\nFirstName:%s\nCity:%s\nState:%s\nClass:%s\nSemester Enrolled:%s\nYear First Enrolled:%s\n\n", \
, , , , , , )
}'
;;
ksh 中的想法几乎相同。
while IFS=: read c1 c2 c3 c4 c5 c6 c7 rest ; do
case "$c1" in
"$last_name" )
printf "LastName:%s\nFirstName:%s\nCity:%s\nState:%s\nClass:%s\nSemester Enrolled:%s\nYear First Enrolled:%s\n\n",
"$c1" "$c2" "$c3" "$c4" "$c5" "$c6" "$c7"
;;
esac
done <
我想我已经把所有的语法都弄对了,但是今晚没有精力去测试:-/ ...如果你能用这个,但有问题,post评论我会清理它。
IHTH.
编辑:
#Case statement for conducting an inquiry of the file
i|I)
#Create Inguiry Message
clear
echo " Record Inquiry "
echo -en '\n'
echo -en '\n'
echo "What is the last name of the person:"
#Gather search parameter
read last_name
while IFS=: read c1 c2 c3 c4 c5 c6 c7 rest ; do
case "$c1" in
"$last_name" )
printf "Last Name:%s\nFirst Name:%s\nCity:%s\nState:%s\nClass:%s\nSemester Enrolled:%s\nYear First Enrolled:%s\n\n", "$c1", "$c2", "$c3", "$c4", "$c5", "$c6", "$c7"
;;
esac
done <
#Case statement for ending the program
x|X) echo "The program is ending" ; exit 0;;
错误信息是:
./asg7s: 第 26 行:第 93 行的语法错误:`)' unexpected
第 93 行是
x|X) echo "The program is ending" ; exit 0;;
有点奇怪,因为我没有弄乱程序的那部分,所以我知道它必须是我更改的部分。
RLG
添加一些额外的东西,这样我就可以在没有其他人的情况下保存 RLG 编辑 "approval"
这个awk
应该做的:
last_name="Gilman"
awk -F: -v name="$last_name" 'NR==1 {for(i=1;i<=NF;i++) h[i]=$i} ==name {for(i=1;i<=NF;i++) print h[i]FS,$i}' file
Last Name: Gilman
First Name: Randy
City: Manhattan
State: KS
Class: Junior
Semester Enrolled: Spring
Year First Enrolled: 2010
它将第一行存储在数组 h
(header).
然后如果找到模式,打印出数组和数据。
我正在使用 UNIX Korn shell。我正在尝试在 Unix 中创建一个程序,它将搜索如下所示的文本文件:
Last Name:First Name:City:State:Class:Semester Enrolled:Year First Enrolled
Gilman:Randy:Manhattan:KS:Junior:Spring:2010
Denton:Jacob:Rochester:NY:Senoir:Fall:2009
Goodman:Joshua:Warren:MI:Freshman:Summer:2014
Davidson:Blair:Snohomish:WA:Sophmore:Fall:2013
Anderson:Neo:Seattle:WA:Senoir:Spring:2008
Beckman:John:Ft. Polk:LA:Freshman:Spring:2014
然后把那条线剪下来垂直显示。所以如果我搜索吉尔曼。它会产生:
Gilman
Randy
Manhattan
KS
Junior
Spring
2010
但是包括在内我应该也能够产生以下布局:
Last Name: Gilman
First Name: Randy
City: Manhattan
State: KS
Class: Junior
Semester Enrolled: Spring
Year First Enrolled: 2010
现在我已经弄清楚了其中的大部分内容,我将在下面的代码中显示这些内容:
cat<<MENULIST
A - Add Student Information
D - Delete Student Information
M - Modify Student Information
I - Inquiry on a Student
X - Exit
MENULIST
echo -en '\n'
echo -en '\n'
echo " Pleasa choose one of the following: "
#take input from operation
read choice
case $choice in
a|A) ;;
d|D) ;;
m|M) ;;
i|I)
#Create Inguiry Message
clear
echo " Record Inquiry "
echo -en '\n'
echo -en '\n'
echo "What is the last name of the person"
#Gather search parameter
read last_name
grep -i "$last_name" | cut -f 1-7 -d ':' ;;
x|X) echo "The program is ending" ; exit 0;;
*) echo -en '\n' ;echo "Not an acceptable entry." ;echo "Please press enter to try again"; read JUNK | tee -a ; continue
esac
我真的很难将输入重定向到正确的输出。该程序还有很多内容,但这是该问题的相关部分。任何帮助将不胜感激。
编辑:
好的,最终答案如下图:
while IFS=: read c1 c2 c3 c4 c5 c6 c7 rest ; do
case "$c1" in
"$last_name" )
echo -e "Last Name: $c1\nFirst Name: $c2\nCity: $c3\nState: $c4\nClass: $c5\nSemester Enrolled: $c6\nYear First Enrolled: $c7\n\n"
;;
esac
done <
这正确地执行了预期的结果感谢大家的帮助。我还有一些其他问题,但我会为此创建一个新主题,以免混淆在一起。
这里我 post shell
脚本的替代方案,在 perl:
perl -F':' -lne '
BEGIN { $name = pop; }
$. == 1 and do { @header = @F; next; };
next if m/^\s*$/;
if ( $F[0] eq $name ) {
for ( $i = 0; $i < @F; $i++ ) {
printf qq|%s: %s\n|, $header[$i], $F[$i];
}
exit 0;
}
' infile Gilman
它使用 -F
开关以冒号分隔字段,-l
删除最后一个换行符,-n
打开输入文件并逐行处理。
该脚本接受两个参数,但我在处理之前提取了最后一个参数,假设它是您要搜索的名称。
第一行保存在一个名为 @header
的数组中,对于下一行,它比较第一个字段,并在匹配中打印每个 header 后跟当前行的每个字段并中止程序.
它产生:
Last Name: Gilman
First Name: Randy
City: Manhattan
State: KS
Class: Junior
Semester Enrolled: Spring
Year First Enrolled: 2010
替换你的线路
grep -i "$last_name" | cut -f 1-7 -d ':' ;;
和
awk -F: -vnameMatch="$last_name" \
'==nameMatch{
printf("LastName:%s\nFirstName:%s\nCity:%s\nState:%s\nClass:%s\nSemester Enrolled:%s\nYear First Enrolled:%s\n\n", \
, , , , , , )
}'
;;
ksh 中的想法几乎相同。
while IFS=: read c1 c2 c3 c4 c5 c6 c7 rest ; do
case "$c1" in
"$last_name" )
printf "LastName:%s\nFirstName:%s\nCity:%s\nState:%s\nClass:%s\nSemester Enrolled:%s\nYear First Enrolled:%s\n\n",
"$c1" "$c2" "$c3" "$c4" "$c5" "$c6" "$c7"
;;
esac
done <
我想我已经把所有的语法都弄对了,但是今晚没有精力去测试:-/ ...如果你能用这个,但有问题,post评论我会清理它。
IHTH.
编辑:
#Case statement for conducting an inquiry of the file
i|I)
#Create Inguiry Message
clear
echo " Record Inquiry "
echo -en '\n'
echo -en '\n'
echo "What is the last name of the person:"
#Gather search parameter
read last_name
while IFS=: read c1 c2 c3 c4 c5 c6 c7 rest ; do
case "$c1" in
"$last_name" )
printf "Last Name:%s\nFirst Name:%s\nCity:%s\nState:%s\nClass:%s\nSemester Enrolled:%s\nYear First Enrolled:%s\n\n", "$c1", "$c2", "$c3", "$c4", "$c5", "$c6", "$c7"
;;
esac
done <
#Case statement for ending the program
x|X) echo "The program is ending" ; exit 0;;
错误信息是:
./asg7s: 第 26 行:第 93 行的语法错误:`)' unexpected
第 93 行是
x|X) echo "The program is ending" ; exit 0;;
有点奇怪,因为我没有弄乱程序的那部分,所以我知道它必须是我更改的部分。
RLG
添加一些额外的东西,这样我就可以在没有其他人的情况下保存 RLG 编辑 "approval"
这个awk
应该做的:
last_name="Gilman"
awk -F: -v name="$last_name" 'NR==1 {for(i=1;i<=NF;i++) h[i]=$i} ==name {for(i=1;i<=NF;i++) print h[i]FS,$i}' file
Last Name: Gilman
First Name: Randy
City: Manhattan
State: KS
Class: Junior
Semester Enrolled: Spring
Year First Enrolled: 2010
它将第一行存储在数组 h
(header).
然后如果找到模式,打印出数组和数据。