【问题标题】:awk find the common rows to two files and combine the rows to a row in a third fileawk 找到两个文件的共同行并将这些行合并到第三个文件中的一行
【发布时间】:2017-03-01 11:53:32
【问题描述】:

我通常是 awk 和 shell 的新手。我想操作一些文件并根据一列找到两个文件的共同行

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

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

file1.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

file2.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

file3.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

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

【问题讨论】:

    标签: bash shell awk


    【解决方案1】:

    你可以使用这个 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
    

    【讨论】:

    • 感谢 anubhava 的快速回复。我尝试了该命令,但所有成绩列都是“NA”
    • 姓名级别 regno 部门性别 NA john 900 123 csc 男性 NA debby 800 378 mth 男性 NA ken 800 234 csc 男性 NA sol 700 923 mth 女性 NA 敢 900 273 phy 男性 NA olanna 800 283 csc 女性 NA olumba 400 245 phy 男性 NA petrus 800 284 个月女性 NA
    • 您的答案中显示的输出是预期输出之一。但是当我运行命令时,我得到的输出与您在答案中显示的输出不同。所有成绩列条目均为“NA”
    • 您的输入文件中可能有 DOS 行结尾。运行dos2unix先将它们转换为unix格式。
    • 非常感谢@anubhava。我认为问题是 DOS 行编辑。我在 UNIX 上再次重建该文件并运行它。该命令现在有效。但是为什么我们在这里使用 $3 a 呢? a[$3] : "NA" 而不是 $2,因为该成绩条目位于 file2.tab 的第二列?
    猜你喜欢
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2014-03-01
    • 2016-12-01
    相关资源
    最近更新 更多