我试图比较三个文件中的一些共同和独特的价值观,我想俱乐部所有三个文件在一个文件。我想找出这三个文件的共同值,第二,至少存在于任何两个文件中的所有值第三,一个文件相对于其他两个文件唯一的值。我写了一个代码,但它只给我常见的。
我只想比较文件之间的“名称”列(不是所有列),但是想打印所有三个文件的所有三列
$ cat file_1
id,name,value
1,a,20
2,b,34
3,c,5
$ cat file_2
id,name,value
1,a,27
2,b,55
7,d,15
9,z,100
$ cat file_3
id,name,value
1,a,77
2,b,95
11,d,83
6,y,109
字符串
预期的输出:
id,name,value,id2,name2,value2,id3,name3,value3
1,a,20,1,a,27,1,a,77
2,b,34,2,b,55,2,b,95
3,c,5,NA,NA,NA,NA,NA,NA
NA,NA,NA,7,d,15,11,d,83
NA,NA,NA,9,z,100,NA,NA,NA
NA,NA,NA,NA,NA,NA,6,y,109
型
我试过这个代码,但它只给我两个文件之间的比较。没有给我唯一的值
#!/usr/bin/awk -f
BEGIN {
FS = OFS = ",";
print "id,name,value,id2,name2,value2,id3,name3,value3";
}
function print_na_row(name) {
print name, "NA", "NA", "NA", "NA", "NA", "NA";
}
# Read file1.csv and store the data in an array
NR == FNR && FNR > 1 {
id = $1;
name = $2;
value = $3;
file1_data[name] = id "," value;
next;
}
# Read file2.csv and file3.csv and merge with data from file1.csv
FNR > 1 {
id = $1;
name = $2;
value = $3;
current_row = id "," value;
if (name in file1_data) {
print name, file1_data[name], current_row;
delete file1_data[name]; # Remove the matched entry to handle unique values in file1.csv
} else {
print_na_row(name);
}
}
END {
for (id in file1_data) {
print_na_row(name);
}
}
型
请帮我拿这个。
4条答案
按热度按时间h6my8fg21#
一个
awk
的想法:字符串
注意事项:
这产生:
型
aydmsdu92#
我不明白为什么你想要你所显示的预期输出,我很难相信你真的想要这样的输出,所以这里有一些对我有意义的输出(通常的输出格式是从
join
操作中期望的,首先是公共字段,然后是每个输入文件的不同字段),你可以按摩以适应。使用任何awk:
字符串
型
u0sqgete3#
我想找出所有三个文件之间的共同值,第二,至少存在于任何两个文件中的所有值,第三,一个文件相对于其他两个文件唯一的值
我建议采用以下方法:在2D数组中存储行数,其中键是line,filename考虑以下简单示例
file1.txt
内容是字符串
file2.txt
内容为型
file3.txt内容为
型
然后,
型
给出输出
型
说明:对于每一行,将数组
arr
中的值在关键字当前行内容($0
)、文件名下增加1。当所有文件都在处理print
行时,以及它们存在于多少个文件中。请注意,这段代码并没有将file3.txt
中的重复行视为2个文件。这段代码应该可以与3个以上的文件一起正常工作。2izufjch4#
字符串