Unix AWK命令比较两个文件,如果在第二个文件中找不到,则报告第一个文件的行,如果找到,则报告第二个文件的行

Unix AWK命令比较两个文件,如果在第二个文件中找不到,则报告第一个文件的行,如果找到,则报告第二个文件的行,unix,Unix,我对unix有基本的了解,所以这个问题可能很容易解决 我一直在尝试使用“awk”命令来比较两个文件(每个文件中的两列由一个选项卡分隔),最终目标是拥有一个包含文件1中所有行的文件,但是如果该行位于文件2中,我希望将文件1中的行替换为文件2中的同一行 File 1: Supercontig_12.1,420 0 Supercontig_12.1,421 0 Supercontig_12.1,422 0 Supercontig_12.1,423 0 …(rows conti

我对unix有基本的了解,所以这个问题可能很容易解决

我一直在尝试使用“awk”命令来比较两个文件(每个文件中的两列由一个选项卡分隔),最终目标是拥有一个包含文件1中所有行的文件,但是如果该行位于文件2中,我希望将文件1中的行替换为文件2中的同一行

File 1: 
Supercontig_12.1,420    0
Supercontig_12.1,421    0
Supercontig_12.1,422    0
Supercontig_12.1,423    0
…(rows continue in numerical order)
Supercontig_12.1,428    0
Supercontig_12.1,429    0
Supercontig_12.1,430    0

File 2 (not in numerical order): 
Supercontig_12.1,422    0.6
Supercontig_12.1,426    0.333333
Supercontig_12.1,428    0.5
Supercontig_12.1,429    0
期望输出

Output: 
Supercontig_12.1,420    0
Supercontig_12.1,421    0
Supercontig_12.1,422    0.6
Supercontig_12.1,423    0.333333
…
Supercontig_12.1,428    0.5
Supercontig_12.1,429    0
Supercontig_12.1,430    0
我一直在使用下面的命令,但它所做的只是将文件2的行添加到文件1的行的末尾,很像“cat”命令

我知道我正在制作一个文件1大小的数组,这是我想要做的,但我没有选择该数组中的文件2数据。欢迎任何帮助。提前谢谢


Andy

当所有行的长度相同时(不是
Supercontig_12.1420
Supercontig_12.14202
),您可以
grep
cut
: 您可以使用获取file2的第一个字段

cut -f1 file2.txt

此命令的输出可以像使用进程替换文件一样使用
file2是否可以在file1中丢失记录?文件1中的值是否始终为0?嗨,Walter,谢谢你的提问。为了回答这个问题,file1中的第二列始终是零,因为我正在尝试将数据输入到“空白”列,不,file2中的记录将始终在file1中找到,只是file1中可能有在file2中找不到的行。谢谢Walter!你的建议几乎奏效了。唯一的问题是:打印数组中的输出文件不是按数字排序的,而是以相当随机的方式分组显示。我试图对文件进行“排序-n-k1”,但逗号后的数字从“、1”增加到“、10”增加到“、100”增加到“、1000”增加到“、1001”……是否有办法打印按数字排序的列,或者在排序中执行辅助命令以按数字排序?谢谢你的帮助!我想我明白了,沃尔特(在输入我的回答之前,我应该做更多的研究)。命令'sort-t',“-k2n output_file.txt”可以实现我想要的功能。不管怎样,你详细的解释给了我很大的帮助。谢谢你花了这么多时间!
cut -f1 file2.txt
grep -vf <(cut -f1 file2.txt) file1.txt
cat file2.txt <(grep -vf <(cut -f1 file2.txt) file1.txt) |sort
awk -F"\t" 'NR==FNR{a[$1]} $1 in a{print $1 "\t" $2}' file1.txt file2.txt
awk -F"\t" 'NR==FNR{a[$1]=$0; next} $1 in a{print $1 "\t" $2}' file1.txt file2.txt
awk -F"\t" 'NR==FNR{a[$1]=$0; next} $1 in a{a[$1]=$0}' file1.txt file2.txt
awk -F"\t" 'NR==FNR{a[$1]=$0; next} $1 in a{a[$1]=$0} END { for (i in a) print a[i] } ' file1.txt file2.txt