我对基本级别的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数据。任何帮助都是最受欢迎的。提前谢谢。
安迪
答案 0 :(得分:0)
如果所有行的长度相同(不是Supercontig_12.1,420
和Supercontig_12.1,4202
),您可以grep
和cut
:
您可以使用
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