我对 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/