我有一个文件,其中列出了一些用户。即: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