bash - awk 查找两个文件的公共(public)行并将这些行合并到第三个文件中的一行

标签 bash shell awk

我对 awk 和 shell 总体来说还是新手。我想操作一些文件并根据列找到两个文件的公共(public)行

并将 file1 中的行和 file2 中的行的组合写入 ​​file3 中的一行。

我在网上检查了许多建议的解决方案,这使我得到了以下结果。 文件结构和我使用的命令如下。

文件1.tab

 name    level   regno   dept    sex
 john    900     123     csc     male
 debby   800     378     mth     male
 ken     800     234     csc     male
 sol     700     923     mth     female
 dare    900     273     phy     male
 olanna  800     283     csc     female
 olumba  400     245     phy     male
 petrus  800     284     mth     female

文件2.tab

 regno   grade
 234     A
 283     D
 123     A
 273     B

我能够使用此命令获取 file3.tab

awk 'NR==FNR{a[$1];next} $3 in a {print $0}' file2.tab file1.tab > file3.tab

文件3.tab

 name    level   regno   dept    sex
 john    900     123     csc     male
 ken    800     234     csc     male
 dare     900     273     phy     male
 olanna     800     283     csc     female

但我想要的是整个 file1 行,并像这样附加 file2 行

 name    level   regno   dept    sex    regno    grade
 john    900     123     csc     male    123    A
 ken    800     234     csc     male    234    A
 dare     900     273     phy     male    273    B
 olanna     800     283     csc     female    283    D

其次,我也想获取这种格式的file3.tab

 name    level   regno   dept    sex    grade
 john    900     123     csc     male    A
 debby   800     378     mth     male    NA
 ken     800     234     csc     male    A
 sol     700     923     mth     female    NA
 dare    900     273     phy     male    B
 olanna  800     283     csc     female    D
 olumba  400     245     phy     male    NA
 petrus  800     284     mth     female    NA

我使用了这个命令

awk 'FNR==NR{a[$1]=$1;next}{print $0, "\t" (($3 in a)? a[$1]:"NA")}' file2.tab file1.tab > file3-2.tab

但是我得到的是这个,并且 file2.tab 中的成绩没有显示

 name    level   regno   dept    sex   
 john    900     123     csc     male   
 debby   800     378     mth     male    NA
 ken     800     234     csc     male   
 sol     700     923     mth     female    NA
 dare    900     273     phy     male   
 olanna  800     283     csc     female   
 olumba  400     245     phy     male    NA
 petrus  800     284     mth     female    NA

所有文件均以制表符分隔。 请帮我解决这些问题。

最佳答案

您可以使用此 awk 命令来实现输出:

awk 'BEGIN{FS=OFS="\t"} NR==FNR{a[$1]=$2;next} {
     print $0, ($3 in a ? a[$3] : "NA")}' file2.tab file1.tab

name    level  regno  dept  sex     grade
john    900    123    csc   male    A
debby   800    378    mth   male    NA
ken     800    234    csc   male    A
sol     700    923    mth   female  NA
dare    900    273    phy   male    B
olanna  800    283    csc   female  D
olumba  400    245    phy   male    NA
petrus  800    284    mth   female  NA

关于bash - awk 查找两个文件的公共(public)行并将这些行合并到第三个文件中的一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42531043/

相关文章:

regex - 如何在 bash 别名中使用正则表达式

bash - 在 bash 脚本 : next occurrence of 3pm 中使用日期命令

php - 让 PHP 执行 shell 脚本的正确且安全的方法

linux - 如何在数组中存储包含双引号的命令参数?

c - 用于生成 AWK 扫描器的 FLEX - 识别变量

bash - 如何在单个 ssh 命令中使用 bash $(awk)?

linux - 使用 mkvmerge 在 bash 中进行 for 循环

bash - 执行后续命令/脚本,在当前命令/脚本之后是 ^C

bash - 从类似 csv 的 txt 文件将十六进制转换为十进制

bash - Cat 从文件输出并一次用 sed 替换单词