awk – 在 2个文件中查找常用元素
发布时间:2020-05-23 09:38:56 所属栏目:Linux 来源:互联网
导读:我有三个文件,如下所示 FILE1.TXT aba 0 0 aba 0 0 1abc 0 1abd 1 1 xxx 0 0 FILE2.TXT xyz 0 0aba 0 0 0 0aba 0 0 0 1xxx 0 0abc 1 1 file3.txt xyx 0 0aba 0 0 aba 0 1 0xxx 0 0 0 1
|
我有三个文件,如下所示 FILE1.TXT "aba" 0 0 "aba" 0 0 1 "abc" 0 1 "abd" 1 1 "xxx" 0 0 FILE2.TXT "xyz" 0 0 "aba" 0 0 0 0 "aba" 0 0 0 1 "xxx" 0 0 "abc" 1 1 file3.txt "xyx" 0 0 "aba" 0 0 "aba" 0 1 0 "xxx" 0 0 0 1 "abc" 1 1 我想基于前两列找到所有三个文件中的类似元素.为了找到两个文件中的类似元素,我使用了类似的东西 awk 'FNR==NR{a[$1,$2]++;next}a[$1,$2]' file1.txt file2.txt
但是,当输入文件超过2时,我们怎样才能在所有文件中找到类似的元素? 使用当前的awk解决方案,输出会忽略重复的键列并将输出作为 "xxx" 0 0 如果我们假设输出来自file1.txt,则预期输出为: "aba" 0 0 "aba" 0 0 1 "xxx" 0 0 即它应该获得具有重复键列的行. 解决方法尝试以下针对N个文件推广的解决方案.它将第一个文件的数据保存在值为1的散列中,并且对于来自下一个文件的每个命中,该值将递增.最后,我比较每个键的值是否与处理的文件数相同,并仅打印匹配的文件.awk '
FNR == NR { arr[$1,$2] = 1; next }
{ if ( arr[$1,$2] ) { arr[$1,$2]++ } }
END {
for ( key in arr ) {
if ( arr[key] != ARGC - 1 ) { continue }
split( key,key_arr,SUBSEP )
printf "%s %sn",key_arr[1],key_arr[2]
}
}
' file{1..3}
它产生: "xxx" 0 "aba" 0 编辑添加打印整行的版本(请参阅注释).我添加了另一个带有相同键的数组,我保存了该行,并在printf函数中使用它.我留下旧代码评论. awk '
##FNR == NR { arr[$1,$2] = 1; next }
FNR == NR { arr[$1,$2] = 1; line[$1,$2] = $0; next }
{ if ( arr[$1,$2]++ } }
END {
for ( key in arr ) {
if ( arr[key] != ARGC - 1 ) { continue }
##split( key,SUBSEP )
##printf "%s %sn",key_arr[2]
printf "%sn",line[ key ]
}
}
' file{1..3}
NEW EDIT(请参阅注释)添加处理具有相同键的多行的版本.基本上我加入所有条目而不只保存一个,更改行[$1,$2] = $0行[$1,$2] =行[$1,$2](行[$1,$2]?SUBSEP:“”)$0.在打印时,我使用分隔符(SUBSEP变量)进行反向分割并打印每个条目. awk '
FNR == NR {
arr[$1,$2] = 1
line[$1,$2] = line[$1,$2] ( line[$1,$2] ? SUBSEP : "" ) $0
next
}
FNR == 1 { delete found }
{ if ( arr[$1,$2] && ! found[$1,$2]++; found[$1,$2] = 1 } }
END {
num_files = ARGC -1
for ( key in arr ) {
if ( arr[key] < num_files ) { continue }
split( line[ key ],line_arr,SUBSEP )
for ( i = 1; i <= length( line_arr ); i++ ) {
printf "%sn",line_arr[ i ]
}
}
}
' file{1..3}
对于有问题的新数据,它会产生: "xxx" 0 0 "aba" 0 0 "aba" 0 0 1 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
