在bash中加入两个文本文件以将输出匹配为两列

用户名

需要在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将两个文本文件中的两个矩阵相乘得出输出为零

匹配两个文本文件中的行

合并两个文本文件中的列

将文本文件打印为两个单独的列表

如何将两个文本文件与文件路径进行比较,并在另一个文本文件中输出差异?

python 比较两个文本文件,然后将输出打印到另一个文件

如果匹配,如何将两个文本文件与第一列进行比较,如果不匹配则打印相同,然后置零?

如何在PHP中使用空格将文本文件中的两个或三个单词匹配

比较两个文本文件的第二列,如果匹配,则打印两个文件的第一列

如何匹配两个文本文件,找到匹配项并替换为原始内容?

如何根据前两个匹配列从多个大型文本文件的第3列提取数据?

批量将两个文本文件合并为一个文件

使用Python优化基于两个文本文件的搜索和输出

输出两个文本文件的公共行(相似性)(与diff相反)?

如何输出两个文本文件之间的差异?

如何在单独的行上将两个回声输出到文本文件

匹配两个文本文件中以相同模式开头的行

从两个文本文件中检索匹配的字符串

在终端中查找两个文本文件之间的匹配

在Clojure中过滤两个文本文件之间的匹配字符串

我如何比较两个文本文件与PHP的匹配

匹配两个文本文件中的字符串并在 Clojure 中过滤

匹配包含两个关键字的文本文件中的一行

两个文本文件之间的单词匹配百分比算法

我如何匹配文本文件中的两个模式

如何在C中将4列文本文件读取为两个char数组?

在 Golang 中合并两个文本文件

Python。比较两个文本文件的内容

同时逐行读取两个文本文件