我有这个问题,但我还没有解决...我想操作这个文件..如果file1的第一列与file2中的任何字符串匹配,则将其替换为file1的第二列...然后将其折叠(我的意思是,在output_file的第二列中,每个字段或“单元格”只需要唯一的值)。
哪种语言都可以解决此问题(awk,perl,python)...文件包含100000行或更多。 ..我一直在尝试单行awk脚本,但是什么也没有...
任何帮助表示赞赏。
问候
file1.txt
ID100000360640 ITEM1;ITEM2
ID100000360638 ITEM1;ITEM3
ID100000360644 ITEM1;ITEM4
ID100000363115 ITEM5;ITEM2;ITEM3
ID100000363116 ITEM1;ITEM7
ID100000382126 ITEM8;ITEM1
ID100000002165 ITEM1;ITEM2;ITEM3;ITEM9
ID100000002596 ITEM1;ITEM10
ID100000003084 ITEM1
file2.txt
ID200000000419 ID100000360638;ID100000360640;ID100000360644;ID100000394921
ID200000000938 ID100000363115;ID100000363116;ID100000363117;ID100000382126
ID200000001036 ID100000002165;ID100000398119
output_expected.txt
ID200000000419 ITEM1;ITEM3;ITEM1;ITEM2;ITEM1;ITEM4;ID100000394921
ID200000000938 ITEM5;ITEM2;ITEM3;ITEM1;ITEM7;ID100000363117;ITEM8;ITEM1;
ID200000001036 ITEM1;ITEM2;ITEM3;ITEM9;ID100000398119
已处理_output.txt
ID200000000419 ITEM1;ITEM2;ITEM3;ITEM4;ID100000394921
ID200000000938 ITEM1;ITEM2;ITEM3;ITEM5;ITEM7;ITEM8;ID100000363117;
ID200000001036 ITEM1;ITEM2;ITEM3;ITEM9;ID100000398119
谢谢
这将产生折叠的输出:
$ awk 'FNR==NR{a[$1]=$2;next} {c="";delete d;delete e;split($2, b, /;/);for (i in b)c=c";"(a[b[i]]?a[b[i]]:b[i]);split(substr(c,2),d,/;/); for(i in d)e[d[i]]=1; c=""; for (i in e){c=c";"i}; print $1,substr(c,2)}' file1.txt file2.txt
ID200000000419 ID100000394921;ITEM1;ITEM2;ITEM3;ITEM4
ID200000000938 ITEM1;ITEM2;ITEM3;ID100000363117;ITEM5;ITEM7;ITEM8
ID200000001036 ITEM1;ITEM2;ITEM3;ID100000398119;ITEM9
FNR==NR{a[$1]=$2;next}
当我们读取第一个文件时,这将创建一个关联数组,该数组a
将第一个字段作为键与第二个字段作为值相关联。因此,的值a[ID100000360640]
是ITEM1;ITEM2
。这是针对的所有行完成的file1.txt
。该next
语句使所有剩余的命令被跳过,并跳到下一行。
c="";delete d;delete e
如果到达这里,则意味着我们正在处理第二个文件file2.txt
。这三个命令初始化变量c
和数组d
和e
为新的线。
split($2, b, /;/)
这将在分号上拆分第二个字段,并将结果分配给array b
。
for (i in b)c=c";"(a[b[i]]?a[b[i]]:b[i])
这将创建未压缩的输出。
split(substr(c,2),d,/;/); for(i in d)e[d[i]]=1
这将创建一个关联数组,e
其键是未压缩输出中的每个字段。
c=""
c
在我们向其添加压缩输出之前,它再次初始化为空行。
for (i in e)c=c";"i
对于数组中的每个键e
,我们将键添加到string中c
。这将创建压缩的输出。
print $1,substr(c,2)
这将打印完整的压缩行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句