需要在Bash脚本中将这两个TXT合并为一个。你能帮忙吗
学生TXT文件
123456 John Doe
345678 John P. Doe
987654 John Public Doe
课程TXT文件
EECS2021 John Doe
EECS2021 John P. Doe
EECS2031 John Doe
EECS4201 John Doe
最终TXT应该包含人员和为他分配的课程。例子:-
Person courses
John Doe EECS2021 | EECS2031 | EECS4201
John P. Doe EECS2021
John Public Doe NoCourses
我尝试了此脚本,但仍然无法得到输出。
#!/bin/sh
persons=`cat T1.txt`
courses=`cat T2.txt`
echo "$persons"
echo "$courses"
linecountf1=$(wc -l T1.txt | awk '{print $1}')
linecountf2=$(wc -l T2.txt | awk '{print $1}')
i=1
y=1
echo "$persons" | while read line
do
name1=$(cat T1.txt | awk -F" " '{print $2" " $3" " $4" " $5" " $6}' | sed -n '$i p')
while [ $linecountf1 = $linecountf2 ]
do
name2=$(cat T2.txt | awk -F" " '{print $2" " $3" " $4" " $5" " $6}' | sed -n '$y p')
if [ "$name1" = "$name2" ]
then
echo "It matching"
gdc=$(cat T2.txt | awk -F" " '{print $1}' | sed -n '$i p')
fi
done
done
echo "John Doe Registered courses - $gdc"
echo "John P. Doe Registered courses -"
echo "John Public Doe Registered courses -"
谢谢
如果输出顺序无关紧要,则以下awk
程序应该可以工作:
awk 'FNR==NR{sub(/^[^ ]* +/,""); courses[$0]; if (length($0)>max) max=length($0); next}
{course=$1; sub(/^[^ ]* +/,"");
if (courses[$0]) courses[$0]=courses[$0] " | " course; else courses[$0]=course}
END{
printf "%- *s Courses\n",max, "Person";
for (p in courses) {printf "%- *s %s\n",max,p,courses[p] ? courses[p] : "NoCourses"}
}' students.txt courses.txt
对于您的输入示例,它将产生(在GNU上awk
):
Person Courses
John Public Doe NoCourses
John P. Doe EECS2021
John Doe EECS2021 | EECS2031 | EECS4201
解释
在处理第一个文件(由FNR
,每个文件的行计数器,等于NR
,全局行计数器)时,我们只是填充一个数组courses
,其中“索引”是学生姓名,并且该值仍然为空。为此,我们使用sub()
函数从行中删除了学生ID,以便仅保留学生姓名($0
现在仅包含学生姓名),这是必需的,因为学生姓名可以包含任意数量的空格,因此通常使用“太空分裂”并不能帮助我们提取名称。
同时,记录最长的名称长度max
,以便以后美化输出。
在处理第二个文件时,将课程号(第一个用空格分隔的字段)保存在一个临时变量中course
,然后再次从行中删除它,以便仅保留学生姓名。然后,在courses
数组中查找学生姓名,如果已经有一个关联的值(即courses[$0]
不为空),则将课程名称附加到现有的值上,并用分隔|
。否则,将值设置为当前课程名称。
处理END
完两个文件后(条件),打印列标题(设置格式以适应最长的学生姓名),然后遍历student-courses-array,并打印每个条目的学生姓名和相关课程(for (p in courses)
意味着遍历所有“数组索引” =中的学生姓名courses
;这是我不能保证输出顺序的部分-取决于您的awk
版本)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句