Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 逐行比较BASH中的两个文件_String_Bash_Awk_Grep_Comparison - Fatal编程技术网

String 逐行比较BASH中的两个文件

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,但无法使其正常工作 试图找到处理时间最短的解决方案。使用

我需要制作一个脚本文件,读取两个文件并打印出它们之间的公共行。我知道两个文件的行数相同,每行只包含一个单词

文件1:

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
默认使用选项卡。