检查一个列表是否包含另一列表中包含的字符串

检查一个列表是否包含另一列表中包含的字符串

我有一个字符串列表,例如 file1.txt:

a
B
ccc
    D
   E
 f

和另一个字符串列表,即 file2.txt:

    a x y z
  43 5 B aa_f
    <|ccc
 |D>
    E
                            FFF

我想检查每一行 file2.txt 是否包含 file1.txt 相应行中包含的修剪字符串(因此周围没有空格)。例如,两个文件中的第 2 行都包含B,因此此测试的计算结果应为true。但是,两个文件中的最后一行不属于子字符串关系,因为 file1.txt 包含f而 file2.txt 在该行中不包含任何f字符。

答案1

假设您的字符串中不包含空格file1.txt,则以下awk基于 - 的方法应该有效:

awk 'NR==FNR{patterns[FNR]=$1} FNR<NR{if (index($0,patterns[FNR])>0) print "true"; else print "false"}' file1.txt file2.txt

对于您的示例,这将产生

true
true
true
true
true
false

一些解释:我们过去常常awk读取这两个文件,但以不同的方式处理它们。

  • 在处理file1.txt由 表示的FNR“每个文件行计数器”时,等于NR全局行计数器,我们只需在-internal$1中注册所有(修剪过的)字符串( ,这是该行的第一个空白分隔字段)awk数组,以行号作为索引(注意它们从 1 开始)。

  • 在处理file2.txt(FNR现在小于 NR) 时,我们使用该函数在整个输入行 ( )中index查找字符串。如果是,将返回大于 0 的起始位置,并打印,否则打印。patterns[FNR]$0index()truefalse

答案2

awk 'ARGIND == 1 { a[NR]=$1;     next }
     $0 ~ a[FNR] { print "true"; next }
                 { print "false"      }' ex1 ex2

在 Awk 中,我更喜欢以更“cond {action}”的结构编写程序。这与@AdminBee 解决方案非常相似。

  • ARGIND ==1- 如果这是第一个参数:保存第一个单词
  • $0 ~ a[FNR]- 如果该行 ( $0) 包含已保存的同源词,则为“true”;否则“假”

相关内容