AWK:2列2文件显示在第二列具有唯一数据的位置
我需要第一列来检查它是否与第二个文件的第一列不匹配。但是,如果第二列与第二个文件中的第二列匹配,则在Linux上使用awk显示此数据 我想让awk检测第一个文件的第一列和第二列以及第二个文件的更改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
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}