根据第一个字段匹配行并组合第二个字段

时间:2011-11-27 02:36:37

标签: shell sed awk

我想使用awk,sed或类似的方法合并来自两个文件的第二个字段的条目。

File0:

string:data:moredata

File1中:

string:random:moredata

如果 file0 中的第一个字段字符串 file1 中有匹配的条目,则打印

$random:$data

选择字段似乎微不足道:

$ awk -F':' '{print $2}' filename

需要匹配行和打印匹配列$ 2

3 个答案:

答案 0 :(得分:2)

这个怎么样 -

awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2

<强>执行:

[jaypal~/Temp]$ cat file1
string:data:moredata

[jaypal~/Temp]$ cat file2
string:random:moredata

[jaypal~/Temp]$ awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2
random:data

在此解决方案中,我们将file1的整个记录​​加载到第1列索引的数组中。我们快速检查下一个文件以查看列1是否存在。如果是,则执行print语句。

否定测试:

[jaypal~/Temp]$ cat file1
string:data:moredata
man:woman:child

[jaypal~/Temp]$ cat file2
man:random:moredata
string:woman:child

[jaypal~/Temp]$ awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2
random:woman
woman:data

只是为了补充说明,NR和FNR是awk的内置变量。 NR提供行号,并且在循环两个文件时不会重置为0。相反,FNR也是在第二个文件启动时重置为0的行号。因此,这允许我们将文件1存储到数组中,因为该操作仅在NR == FNR时完成。一旦此条件变为false,则表示第二个文件已启动,下一个模式操作语句开始执行。

答案 1 :(得分:1)

sed解决方案可能适合您:

# cat file1
string0:data1:moredata
string2:data3:moredata
string4:data5:moredata
string6:data7:moredata
string8:data9:moredata
# cat file2
string0:random1:moredata
string2:random3:moredata
string4:random5:moredata
cat file1 - <<<"EOF" file2 | 
sed '1,/^EOF/{H;d};G;s/^\([^:]*:\)\([^:]*:\).*\1\([^:]*\).*/$\2$\3/p;d'
$random1:$data1
$random3:$data3
$random5:$data5

说明:

使用EOF分隔符连接文件。将第一个文件粘贴到保留空间(HS)。将HS附加到第二个文件中的所有行,生成查找表。使用分组和反向引用替换所需的输出结果。 BTW是$$random:$data的意图?

只需在查找和file2的每一行中保留必要的数据,也可以提高此解决方案的效率。

答案 2 :(得分:0)

join - join lines of two files on a common field

你的awk就是这样,只打印数据和“key”字段。然后执行类似于:join -1 1 -2 1 file1 file2 > joined.dat

的连接命令