我有两个未排序的文件,每个文件都有两列。对于 file1 中第 1 列值与 file2 中任何行的值匹配但第 2 列值不同的任何行,我想打印第 1 列值和每个第 2 列值。
如果文件 1 中列 1 的数据在文件 2 中不存在,则可以将其丢弃。我不需要在输出文件中保留排序顺序。
file1:
2222,b2
4444,d4
1111,a1
3333,c3
5555,e5
file2:
2222,8f
5555,e9
4444,7c
3333,c3
OUTPUT file:
2222,b2,8f
4444,d4,7c
5555,e5,e9
答案1
读取第二个文件,将内容保存到数组中(键=第一个字段,值=第二个字段),然后读取第一个文件并检查第一个字段是否是公共键以及对应的第二个字段是否不同。如果结果为正,则打印密钥和两个值:
awk 'BEGIN{FS=OFS=","}NR==FNR{z[$1]=$2;next}
{if (z[$1] && (z[$1]!=$2)){print $0, z[$1]}}' file2 file1
答案2
编辑:最初写的问题相当不清楚,并且缺乏重要的细节。以下是我随着问题的清晰发展而写下的两个原始答案。对于与当前所写问题类似的更简单的情况,答案非常有用。
对于排序和匹配文件的情况,我建议首先使用命令行实用程序
paste
创建一个临时的第三个文件,该文件将在每行添加文件二的第二列。将此paste
命令的输出通过管道传输到awk
,然后您的awk
解决方案就变得微不足道 -$2 != $4{printf "%s %s %s", $1, $2, $4}
。粘贴 -d"," file1 file2 | awk 'BEGIN{FS=",";OFS=","}$2 != $4{printf "%s,%s,%s", $1, $2, $4}'
对于未排序的匹配文件的情况,如果所有键
sort
file1 和 fil2 的内容相同,只是paste
.您可以在 shell 中执行此类操作bash
,使用流程替代,采用 形式<( command )
,如下例所示:粘贴 -d"," <( 排序文件 1 ) <( 排序文件 2 ) | awk 'BEGIN{FS=",";OFS=","}$2 != $4{printf "%s,%s,%s", $1, $2, $4}'
对于未排序且不匹配的文件集(当前编写的问题),请参阅用户 don_crissti 的回答。
答案3
我可以使用 join 吗?
sort -o file1 file1
sort -o file2 file2
join -t"," -1 1 -2 1 file1 file2 | awk '$2!=$3'