AWK:显示2列2个文件,其中第二列具有唯一数据

时间:2019-05-04 16:30:06

标签: awk

我需要第一列来检查它是否与第二个文件中的第一列不匹配。但是,如果第二列与第二个文件中的第二列匹配,则在Linux上使用awk显示此数据。

我希望awk可以检测到第一个文件的第一列和第二列以及第二个文件的变化。

file1.txt
sdsdjs ./file.txt
sdsksp ./example.txt
jsdjsk ./number.txt
dfkdfk ./ok.txt

file2.txt
sdsdks ./file.txt <-- different
sdsksd ./example.txt   <-- different
jsdjsk ./number.txt <-- same
dfkdfa ./ok.txt <-- different

Expected output:
sdsdks ./file.txt
sdsksd ./example.txt
dfkdfa ./ok.txt

请注意第二个文件中可能缺少行并且与第一个文件不同。

如上所示,awk如何仅在第二列是唯一的并且与第一列不匹配的地方显示结果?

6 个答案:

答案 0 :(得分:3)

类似的方法可能对您有用:

awk 'FNR == NR { f[FNR"_"$2] = $1; next }
     f[FNR"_"$2] && f[FNR"_"$2] != $1' file1.txt file2.txt

故障:

FNR == NR {                        } # Run on first file as FNR is record number for the file, while NR is the global record number
            f[FNR"_"$2] = $1;        # Store first column under the name of  FNR followed by an underbar followed by the second column 
                              next   # read next record and redo
f[FNR"_"$2] && f[FNR"_"$2] != $1     # If the first column doesn't match while the second does, then print the line

一种更简单的方法将忽略第二列:

awk 'FNR == NR { f[FNR"_"$1] = 1; next }
     !f[FNR"_"$1]' file1.txt file2.txt

答案 1 :(得分:2)

如果记录不必位于文件中的相应位置,即。我们比较匹配的第二列字符串,这应该足够了:

std::unique_ptr

输出:

$ awk '{if($2 in a){if($1!=a[$2])print $2}else a[$2]=$1}' file1 file2

精美印刷:

file.txt

已更新

$ awk '{
    if($2 in a) {           # if $2 match processing
        if($1!=a[$2])       # and $1 don t
            print $2        # output
    } else                  # else
        a[$2]=$1            # store
}' file1 file2

基本上将$ awk '{if($2 in a){if($1!=a[$2])print $1,$2}else a[$2]=$1}' file1 file2 sdsdks ./file.txt sdsksd ./example.txt dfkdfa ./ok.txt 更改为print $2

答案 2 :(得分:0)

您的问题的措词方式非常混乱,但是在阅读了几次并查看您发布的预期输出后,我想您只是想说您希望来自file2的行不会出现在file1中。如果是这样的话:

$ awk 'NR==FNR{a[$0];next} !($0 in a)' file1 file2
sdsdks ./file.txt
sdsksd ./example.txt
dfkdfa ./ok.txt

如果您的实际数据中的字段多于示例输入中显示的字段,但是您只希望考虑前两个字段进行比较,则可以解决问题以显示更真实的示例,但解决方案是:

$ awk 'NR==FNR{a[$1,$2];next} !(($1,$2) in a)' file1 file2
sdsdks ./file.txt
sdsksd ./example.txt
dfkdfa ./ok.txt

如果不是,那么请编辑您的问题以阐明您要执行的操作,并提供一个示例,其中上述示例未产生预期的输出。

答案 3 :(得分:0)

我通过以下方式了解原始问题:

  • 两个文件file1file2包含一组键值对。
  • 是文件名,值是第一列中的字符串
  • 如果在file1file2之间找到了匹配的 key ,但是 value 不同,则打印{{1} }

您实际上并不需要高级awk,可以通过简单的awk和grep管道轻松实现。

file2

这里,第一个grep将从$ awk '{print $NF}' file2.txt | grep -wFf - file1.txt | grep -vwFf - file2.txt sdsdks ./file.txt sdsksd ./example.txt dfkdfa ./ok.txt 中选择具有相同密钥(文件名)的行。第二个grep将尝试从file2中的file1搜索完整匹配的行,但是它将打印失败。请注意,在这种情况下,行必须完全相同。

如果您只想使用awk,则可以使用Ed Morton提出的解决方案来实现上述逻辑。无需在这里重复。

答案 4 :(得分:0)

我认为这就是您要寻找的

$ awk 'NR==FNR{a[$2]=$1; next} a[$2]!=$1' file1 file2

sdsdks ./file.txt
sdsksd ./example.txt  
dfkdfa ./ok.txt

打印来自file2的记录,其中相同的field2值的field1值不同。该脚本假定field2值在每个文件中都是唯一的,因此可以将其用作键。由于内容看起来像文件路径,因此这是一个有效的假设。否则,您需要将记录与相应的行号匹配。

答案 5 :(得分:0)

如果您要基于行的第一个字段来查找更直接的基于行的差异,那么

awk 'NR==FNR { a[NR] = $1; next } a[FNR]!=$1' file1 file2