比较awk中两个文件的字段
我想比较两个文件的两个字段,如下所示: 将文件1的第2个字段与文件2的第1个字段进行比较,打印匹配项(即使匹配重复)以及文件1和文件2的所有列 文件1:比较awk中两个文件的字段,awk,Awk,我想比较两个文件的两个字段,如下所示: 将文件1的第2个字段与文件2的第1个字段进行比较,打印匹配项(即使匹配重复)以及文件1和文件2的所有列 文件1: G4 b45 3 4 G4 b45 1 3 G3 b23 2 2 G3 b22 2 6 G3 b22 2 4 文件2: b45 a b c b64 d e f b23 g h i b22 j k l b20 m n o 输出: G4
G4 b45 3 4
G4 b45 1 3
G3 b23 2 2
G3 b22 2 6
G3 b22 2 4
文件2:
b45 a b c
b64 d e f
b23 g h i
b22 j k l
b20 m n o
输出:
G4 b45 a b c 3 4
G4 b45 a b c 1 3
G3 b23 g h i 2 2
G3 b22 j k l 2 6
G3 b22 j k l 2 4
我使用关联数组使用以下awk命令尝试了这一点:
awk 'FNR==NR {array1[$2] = $1 ; arrayrest[$2] = substr($0, index($0, $2)); next}($1 in array1) {print array1[$1] "\t" $0 "\t" arrayrest[$1]}' file1 file2
但有两个问题:
如何使这个awk命令很好地工作?提前感谢。不是您想要的确切输出格式,而是正确的输出内容
awk 'FNR==NR{seen[$1]=$0; next} ($2 in seen) {$2=seen[$2]}7' file2 file1
添加| column-t
以获得更一致的列间距。小awk
awk '{x[$1]=$0}$2=x[$2]' f2 f1
如果$1和$2可以包含相同的值
awk '{x[$1]=$0}FNR!=NR&&$2=x[$2]' f2 f1
输出
这对u来说应该简单明了:
awk 'NR==FNR {n[$2]=$0} {if ($1 in n) print n[$1],$2,$3,$4}' file1 file2
您是否尝试过使用
加入join-12-21+1知道我不是唯一一个用右手食指(7
)比用左手小指(1
)更多的人:-D但是它可能是awk'FNR==NR{..}($2 in seen)和&$2=seen[$2]
@Kent-Hah!这就是你这么做的原因吗?我之所以采用它,是因为我认为它使它看起来越来越不“神奇”,这(希望)会让人们问起它。我在列之间添加OFS=“\t”以获得一个标签。为了确保我理解,您将第二个文件的第一列作为“seen”数组的键,并将第二个文件的所有列作为其值,是否正确?然后检查第一个文件的第2列是否存在于“seen”数组的键中,如果存在,则打印整个文件,其中第二列为第二个文件的第二列。是这样吗?现在,7对我来说确实是一个神奇的名词?如果可能的话,请您解释一下好吗?@EtanReisner是的,我左手小指最频繁的击键是ESC
,就在我键盘上1
旁边。@Kent我之所以不使用这样的模式分配,有两个原因。我已经被结果0
或“
和awk咬了几次,考虑到这是错误的,因为我认为这对不熟悉awk的人来说更容易混淆。但你是对的,在这种情况下,它肯定会安全工作。聪明。但是,如果f2
的任何第二个字段与该文件中的任何前一个字段匹配,则这不起作用(我不知道该数据是否可能)。添加FNR==NR
和next
修复了这个问题。如果f2
中的任何一行正好是0
,它也会失败,但这似乎不太可能用于此数据。@EtanReisner我使用的是file1的$1和$2不太可能包含相同的值这一事实(从示例判断)。此外,它们的数字前面似乎有一个字符,因此0不应该是一个问题。显然,这不是一个非常通用的方法,而您的方法更适合于更广泛的问题。出于好奇,您选择ARGIND@EtanReisner不是特别不,只是觉得我会做得和平常不一样。无论如何,我已更新:)
awk 'NR==FNR {n[$2]=$0} {if ($1 in n) print n[$1],$2,$3,$4}' file1 file2