String 逐行比较BASH中的两个文件
我需要制作一个脚本文件,读取两个文件并打印出它们之间的公共行。我知道两个文件的行数相同,每行只包含一个单词 文件1:String 逐行比较BASH中的两个文件,string,bash,awk,grep,comparison,String,Bash,Awk,Grep,Comparison,我需要制作一个脚本文件,读取两个文件并打印出它们之间的公共行。我知道两个文件的行数相同,每行只包含一个单词 文件1: Blue Red Orange Green Yellow Blue 文件2: Blue Green Red Purple Yellow Blue 预期产出: Blue Yellow Blue 因此,在示例中,红色和绿色显示在两个文件中,但它们在每个文件中不在同一行,因此将忽略它们 曾尝试使用awk、grep和comm,但无法使其正常工作 试图找到处理时间最短的解决方案。使用
Blue
Red
Orange
Green
Yellow
Blue
文件2:
Blue
Green
Red
Purple
Yellow
Blue
预期产出:
Blue
Yellow
Blue
因此,在示例中,红色和绿色显示在两个文件中,但它们在每个文件中不在同一行,因此将忽略它们
曾尝试使用awk、grep和comm,但无法使其正常工作
试图找到处理时间最短的解决方案。使用awk:
awk 'NR == FNR { lines[NR] = $0 } NR != FNR && lines[FNR] == $0 { print }' file1 file2
说明:
- 读取第一个文件(
)时,构建行号到值的映射NR==FNR
- 当不读取第一个文件(
)时,如果当前行与缓存中的对应行匹配,则打印该行NR!=FNR
并使用大约与第一个文件大小相同的内存。使用paste和GNU grep。一步一步
paste -d '|' file1 file2
输出:
Blue|Blue
Red|Green
Orange|Red
Green|Purple
Yellow|Yellow
Blue|Blue
Blue|Blue
Yellow|Yellow
Blue|Blue
Blue
Yellow
Blue
输出:
Blue|Blue
Red|Green
Orange|Red
Green|Purple
Yellow|Yellow
Blue|Blue
Blue|Blue
Yellow|Yellow
Blue|Blue
Blue
Yellow
Blue
输出:
Blue|Blue
Red|Green
Orange|Red
Green|Purple
Yellow|Yellow
Blue|Blue
Blue|Blue
Yellow|Yellow
Blue|Blue
Blue
Yellow
Blue
蓝色
黄色的
蓝色
我假定
|不在您的文件中。使用粘贴和awk
:
paste -d'|' file1 file2 | awk -F'|' '$1==$2 {print $1}'
我喜欢使用@Cyrus中的paste
,但我认为使用awk
更容易理解合并行的比较。在这种情况下,-F
注意使用相同的分隔符|
,比较第一位$1
和第二位$2
非常简单。输出可以是任意一个
还假定|
不是输入文件的一部分。可以选择任何其他字符
如果输入文件的每一行只包含一个单词,则这将更短,并且也适用:
paste file1 file2 | awk '$1==$2 {print $1}'
还有一些方法
awk 'FNR==NR{a[FNR,$1];next}(FNR,$1) in a' file1 file2
测试结果:
$ cat f1
Blue
Red
Orange
Green
Yellow
Blue
$ cat f2
Blue
Green
Red
Purple
Yellow
Blue
$ awk 'FNR==NR{a[FNR,$1];next}(FNR,$1) in a' f1 f2
Blue
Yellow
Blue
使用\K
触感很好。顺便说一句,如果您已经在使用PCRE,您可以将其缩短为paste file1 file2 | grep-Po'(.*)\t\K\1$”
,因为paste
默认使用选项卡。