小编Jpi*_*ike的帖子

awk:比较两个文件的内容,打印匹配和不匹配

我想比较两个文件 File1.txt 和 File2.txt 的内容。当 File2.txt 的第 1 列中的一行与 File1.txt 的第 1 列中的一行匹配时,我想从 File2.txt 输出整行。如果 File2.txt 中没有匹配 File1.txt 的第 1 列中的行,那么我想打印 File1.txt 的第 1 列中该行的内容,然后是 tab,然后是 0。我也想尝试在输出中保留第 1 列中的行顺序。

文件1.txt

abc
def
ghi
jkl
Run Code Online (Sandbox Code Playgroud)

文件2.txt

abc    2
ghi    1
Run Code Online (Sandbox Code Playgroud)

这是我一直在使用的命令,但它只输出匹配的实例。它不会打印没有匹配后跟由制表符分隔的 0 的实例。

awk 'NR==FNR{a[$1];next} $1 in a{if ($1 in a) print $0;else print a[$1],"\t","0"}' File1.txt File2.txt 
Run Code Online (Sandbox Code Playgroud)

我认为代码在下面做什么:

awk 'NR==FNR{a[$1];next} :为第一个文件的第 1 列创建一个数组。

$1 in a : 遍历数组。

{if ($1 in a) print $0; 如果 File2.txt 中的行与数组中的行匹配,则打印 File2.txt 中的所有行

;else print …

awk

2
推荐指数
1
解决办法
85
查看次数

如何在awk中为变量着色

我有一个完美的 awk 命令:

awk '{a[$1]++}END{for(i in a){printf i"\t"a[i]"\n"}}' infile
Run Code Online (Sandbox Code Playgroud)

它计算 $1 中的重复次数。输出如下所示:

MTRFHLILLPLLFSWFSYCFG_1    1
MLAELSVAFTLAAFALA_rc_1     3
Run Code Online (Sandbox Code Playgroud)

我想让输出变成红色。\033[01;31m

通常,当我想在 awk 中为输出着色时,我会这样做:

RED='\033[01;31m'
NONE='\033[0m'

awk -v r=$RED -v n=$NONE '{printf r$1n"\n"}' infile 
Run Code Online (Sandbox Code Playgroud)

我用我上面描述的命令尝试了这个(计算 $1 中的重复次数),但它不起作用。我认为这是因为 awk 无法将 r 和 i 识别为单独的变量,例如,在 bash 中我会使用 $r$i。是这种情况吗?

这是我尝试过的命令:

awk -v r=$RED -v n=$NONE '{a[$1]++}END{for(i in a){printf ri"\t"a[i]"\n"n}}' infile
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

1 #See how the first half of the output (i) is missed and is not coloured. 
3
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么这不起作用并帮助我解决它?

谢谢

awk colors

0
推荐指数
1
解决办法
45
查看次数

标签 统计

awk ×2

colors ×1