我想用awk,sed或类似的方法将来自两个文件的第二个字段的条目组合起来。根据第一个字段匹配行并合并第二个字段
File0:
string:data:moredata
文件1:
string:random:moredata
如果第一场,串在file0在文件1匹配的条目,然后打印
$random:$data
选择领域似乎微不足道:
$ awk -F':' '{print $2}' filename
需要匹配的行和打印匹配列$ 2
我想用awk,sed或类似的方法将来自两个文件的第二个字段的条目组合起来。根据第一个字段匹配行并合并第二个字段
File0:
string:data:moredata
文件1:
string:random:moredata
如果第一场,串在file0在文件1匹配的条目,然后打印
$random:$data
选择领域似乎微不足道:
$ awk -F':' '{print $2}' filename
需要匹配的行和打印匹配列$ 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
在这个解决方案中,我们加载文件1的整个记录中在列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时完成。一旦这个条件变为假,这意味着第二个文件已经启动并且下一个模式动作语句开始执行。
join - join lines of two files on a common field
所以做你的awk的事情,只有同时打印数据和“重点”领域。然后做一个加入类似的命令:join -1 1 -2 1 file1 file2 > joined.dat
这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附加到第二个文件中的所有行中,制作查找表。使用分组和反向引用来替代所需的输出结果。顺便说一句,$
的$random:$data
打算?
此解决方案也可以通过只保留查找和file2的每一行中的必要数据来提高效率。
做得很好!您应该开始在SED单线上撰写电子书。我还没有想出G,H和其他疯狂的东西。 :) +1 –
'$'不是必需的,想要传达不同的领域。感谢您的反馈。 – Astron
不知道如何使用刚刚加入,因为他们有可能不进行排序,进而** ** file0可能有更少的行相匹配的行。 – Astron
我不认为更少的行很重要。这就像数据库表,我想。 (我只用过一次'join',这是几年前的事情。)'man'页面在分类时不清楚。一部分说你必须排序,另一部分暗示'join'可以为你排序。我猜,实验是必需的。 – drysdam