我有一个字符串列表,例如 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]
$0
index()
true
false
答案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”;否则“假”