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

时间:2017-04-01 00:31:03

标签: unix

我对基本级别的unix理解,所以这个问题可能很容易。

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

test

期望的输出

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

我一直在使用以下命令,但它只是将文件2的行添加到文件1的行的末尾,就像“cat”命令一样。

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

我知道我正在创建一个文件1大小的数组,这是我想做的,但我不是在选择该数组中的文件2数据。任何帮助都是最受欢迎的。提前谢谢。

安迪

1 个答案:

答案 0 :(得分:0)

如果所有行的长度相同(不是Supercontig_12.1,420Supercontig_12.1,4202),您可以grepcut: 您可以使用

获取file2的第一个字段
cut -f1 file2.txt

此命令的输出可以用作具有进程替换<(some_command)的文件 从file1.txt中删除这些行

grep -vf <(cut -f1 file2.txt) file1.txt

将它与file2放在一起并对结果进行排序

cat file2.txt <(grep -vf <(cut -f1 file2.txt) file1.txt) |sort

您的awk有什么问题?

awk -F"\t" 'NR==FNR{a[$1]} $1 in a{print $1 "\t" $2}' file1.txt file2.txt

解析file1.txt时,您不想打印任何内容。使用next。并存储$ 0:

awk -F"\t" 'NR==FNR{a[$1]=$0; next} $1 in a{print $1 "\t" $2}' file1.txt file2.txt

a中找到来自file2.txt的$ 1时,请替换该值(不要打印)

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