我需要第一列来检查它是否与第二个文件中的第一列不匹配。但是,如果第二列与第二个文件中的第二列匹配,则在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如何仅在第二列是唯一的并且与第一列不匹配的地方显示结果?
答案 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)
我通过以下方式了解原始问题:
file1
和file2
包含一组键值对。file1
和file2
之间找到了匹配的 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