比较两个文件并在匹配时修改输入

比较两个文件并在匹配时修改输入

我想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是否包含与$2file1中的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 行开始的奇怪替换在末尾添加了一个换行符,因此我们知道每个模式都会被换行符包围。

相关内容