检查文件 - 逐行匹配条件

检查文件 - 逐行匹配条件

我有一个文件,其中列出了一些用户。即:alluser.list如下:

 user1
 user4
 user2
 user4
 user5
 user3
 user2

我还有另一个,名称userbanned.list如下:

 user5
 user4
 user2

现在我正在寻找一种简单的方法来处理alluser.list文件并与 进行比较userbanned.list,如果匹配,那么我想在行末尾添加一个类似 True/False 的标志。

结果应该是这样的:

 user1 FALSE
 user4 TRUE
 user2 TRUE
 user4 TRUE
 user5 TRUE
 user3 FALSE
 user2 TRUE

答案1

使用awk;

$ awk 'NR==FNR{ seen[$0]++;next } 
    { print $0 (($0 in seen)?" TRUE":" FALSE")}' userbanned.list alluser.list
user1 FALSE
user4 TRUE
user2 TRUE
user4 TRUE
user5 TRUE
user3 FALSE
user2 TRUE

awk分解:

NR==FNR - 仅对第一个文件“userbanned.list”执行下一个块

see[$0]++ - 创建一个关联数组,其键为 '$0'(整行)
             文件“userbanned.list”

下一个 - 继续读取文件“userbanned.list”的下一行

print $0 - 打印“alluser.list”文件的整行,现在 FNR 重置为 1
             由于 awk 读取下一个文件,但 NR 仍在递增,直到最后一个
             上次读取的文件中的行。

((看到 $0)?" TRUE":" FALSE")
           - 这称为三元运算符 '(条件)?"If-True":"If-False"'。它是
             if/else/ 的缩写形式并检查文件“alluser.list”中的当前行是否
             存在于数组中,然后打印“TRUE”,否则“FALSE”。

我还看到您有重复的用户,这将导致这些用户打印两次或多次,您可以对两个文件中的行进行唯一化,然后将其传递给awk如下所示:

$ awk 'NR==FNR{ seen[$0]++;next } { print $0 (($0 in seen)?" TRUE":" FALSE")}
    ' <(sort -u userbanned.list) <(sort -u alluser.list)
user1 FALSE
user2 TRUE
user3 FALSE
user4 TRUE
user5 TRUE

相关内容