AWK:2列2文件显示在第二列具有唯一数据的位置

AWK:2列2文件显示在第二列具有唯一数据的位置,awk,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

我需要第一列来检查它是否与第二个文件的第一列不匹配。但是,如果第二列与第二个文件中的第二列匹配,则在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
file1.txt
sdjs./file.txt
sdsksp./example.txt
jsdjsk./number.txt
dfkdfk./ok.txt
file2.txt

sdk./file.txt类似的内容可能适合您:

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

这样的东西可能适合你:

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

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

$ 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
更改为
print$1$2

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

$ 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
更改为
print$1,

您的问题的措辞非常混乱,但在阅读了几遍并查看了您发布的预期输出后,我认为您只是想说您想要文件2中没有出现在文件1中的行。如果是这样,那只是:

$ 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

如果不是这样,请编辑你的问题,澄清你想做什么,并举例说明上述内容没有产生预期结果。

你的问题的措辞非常混乱,但在阅读了几遍并查看了你发布的预期结果后,我想你只是想说你想要文件2中未出现在文件1中的行。如果是这样,那只是:

$ 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

如果不是这样,请编辑您的问题,以澄清您试图做的事情,并包括一个上面没有产生预期输出的示例。

我以以下方式理解原始问题:

  • 两个文件,
    file1
    file2
    包含一组键值对
  • 键是文件名,值是第一列中的字符串
  • 如果在
    file1
    file2
    之间找到匹配键,但值不同,则打印
    file2
您并不需要高级awk来完成此任务,它可以通过简单的awk和grep管道轻松实现

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


如果您只想使用awk,那么上述逻辑是通过提供的解决方案实现的。无需在此重复。

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

  • 两个文件,
    file1
    file2
    包含一组键值对
  • 键是文件名,值是第一列中的字符串
  • 如果在
    file1
    file2
    之间找到匹配键,但值不同,则打印
    file2
您并不需要高级awk来完成此任务,它可以通过简单的awk和grep管道轻松实现

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


如果您只想使用awk,那么上述逻辑是通过提供的解决方案实现的。不必在这里重复。

我想这就是你要找的

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

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

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

我想这就是你要找的

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

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

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

如果您正在寻找一个更直接的基于行的差异,则基于行上的第一个字段是不同的

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

如果您正在寻找一个更直接的基于线的差异,基于线的第一个字段是不同的

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

第一列和第二列相互结合用于比较上一个文件的内容…第一列和第二列相互结合用于比较上一个文件的内容…@Dave只需从解决方案中删除
{print$2}
。@Dave只需删除
{print}