gpt4 book ai didi

awk - 在 >2 个文件中查找共同元素

转载 作者:行者123 更新时间:2023-12-04 12:22:21 24 4
gpt4 key购买 nike

我有三个文件,如下所示

文件1.txt

"aba" 0 0 
"aba" 0 0 1
"abc" 0 1
"abd" 1 1
"xxx" 0 0

文件2.txt
"xyz" 0 0
"aba" 0 0 0 0
"aba" 0 0 0 1
"xxx" 0 0
"abc" 1 1

文件 3.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

即它也应该获得具有重复键列的行。

最佳答案

尝试以下为 推广的解决方案否 文件。它将第一个文件的数据保存在值为 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 %s\n", 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] ) { arr[$1,$2]++ } }
END {
for ( key in arr ) {
if ( arr[key] != ARGC - 1 ) { continue }
##split( key, key_arr, SUBSEP )
##printf "%s %s\n", key_arr[1], key_arr[2]
printf "%s\n", line[ key ]
}
}
' file{1..3}

新编辑 (见评论)添加一个版本,用相同的键处理多行。基本上我加入所有条目而不是只保存一个,更改 line[$1,$2] = $0line[$1,$2] = line[$1,$2] ( line[$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] ) { arr[$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 "%s\n", line_arr[ i ]
}
}
}
' file{1..3}

使用有问题的新数据编辑,它产生:
"xxx" 0 0
"aba" 0 0
"aba" 0 0 1

关于awk - 在 >2 个文件中查找共同元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16935918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com