我想file1
与进行比较file2
。
file1
包含一组路径名并file2
包含一组单词。
如果任何路径名包含第二个文件中的任何单词,则应通过在该行前面添加//
.
file1
:
xxx/AAA.tmp.v
xxx/BBB.tmp.v
xxx/CCC.tmp.v
file2
:
BBB
CCC
FFF
新文件中所需的输出:
xxx/AAA.tmp.v
// xxx/BBB.tmp.v
// xxx/CCC.tmp.v
答案1
你可以使用awk
.
awk -F"[/.]" 'NR==FNR{seen[$0];next}
($2 in seen){print "// "$0; next}1
' file2 file1
-F"[/.]"
将字段分隔符定义为斜杠/
或点.
。NR==FNR
对于第一个输入数据(此处为 file2)始终如此,右埃科德氮数量==F伊莱右埃科德氮数。seen[$0];next
如果上述为真,则将 file2 的整行保存到名为 的数组中seen
,然后读取下一行next
(实际上转到第一个并再次运行此块,直到NR!=FNR
)($2 in seen){print "// "$0; next}1
这仅适用于第二个输入文件(此处为file1),并查找数组seen
是否包含与$2
file1中的column#2相同的字符串,然后打印file1的整行并预先附加//
,并next
再次检查条件直到匹配,否则打印带有条件的整行1
(这是enableawk
的默认操作)。
答案2
你sed
可以这样做:
sed '/tmp/!{H;d;}
G;s/$/\
/;s_.*\(..*\).*\n\1\n_// &_
P;d' file2 file1
您在保留空间中收集 file2 的模式,并为 file1 的每一行附加该集合,并使用反向引用检查是否在该行中找到该模式。
更详细的解释请参见这个问题和答案。
请注意,我使用该字符串tmp
来指示我们位于 file1 中;您可能需要根据您的实际情况进行调整。从第 2 行开始的奇怪替换在末尾添加了一个换行符,因此我们知道每个模式都会被换行符包围。