如果file1的第一列与file2中的任何字符串匹配,则将其替换为file1的第二列

内夫贾夫

我有这个问题,但我还没有解决...我想操作这个文件..如果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 

谢谢

约翰1024

这将产生折叠的输出:

$ 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.txtnext语句使所有剩余的命令被跳过,并跳到下一行。

  • c="";delete d;delete e

    如果到达这里,则意味着我们正在处理第二个文件file2.txt这三个命令初始化变量c和数组de为新的线。

  • 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果file1的第一列与file2中的任何字符串匹配,则将其替换为file1的第二列

来自分类Dev

用file1中file2第二列中的模式替换file2中第一列中的模式

来自分类Dev

替换File1中的模式,并将其替换为File2中相应的匹配模式+列

来自分类Dev

在file1中添加新列,该新列在参考文件file2中输出与file1中另一列的值匹配的字符串

来自分类Dev

file1中第三列与file2中第一列的模式匹配

来自分类Dev

如果file2中存在file1中的列值,则将file1中的所有行值添加到file2中

来自分类Dev

匹配两个文件的第一列,并在Linux中的File1中合并File2的最后一列

来自分类Dev

需要将一个字符串从file1替换为file2

来自分类Dev

如何使用粘贴将一列从file2追加到file1

来自分类Dev

Awk获取file1列并检查file2的column1,如果匹配则打印相应的值

来自分类Dev

将file1中的M行替换为file2中的N行

来自分类Dev

Awk - 在 file2 中找到匹配项后从 file1 调用第二个关联值

来自分类Dev

Hamcrest: file1 或 file2

来自分类Dev

仅比较 File1(CSV 格式)中的前 4 列与 File2 中的前 4 列并打印 File1 i 中的所有列

来自分类Dev

将值从file1替换为file2 awk

来自分类Dev

用file2中的相应行替换file1中的数字

来自分类Dev

从file1读取行并替换file2中的行标记的最快方法

来自分类Dev

将file1的行值添加到file2的列标题中

来自分类Dev

有条件地将file1的行替换为file2的相应行

来自分类Dev

awk将file1与file2匹配并输出匹配项

来自分类Dev

删除file1在file2上存在的行

来自分类Dev

如何为n列而不是3列写awk'{print $ 1 + $ 2 + $ 3} file1> file2?

来自分类Dev

了解花括号对重定向的影响(“> file1>&file2”与“ {> file1;}>&file2”)

来自分类Dev

了解花括号对重定向的影响(“> file1>&file2”与“ {> file1;}>&file2”)

来自分类Dev

awk,读取file1中的rowS并将其输出为file2中的并行columnS

来自分类Dev

Linux中两个文件的重叠,或分别用file2中的行替换file1中的行

来自分类Dev

sed-使用file1查找file2中包含的替换文件3中的行

来自分类Dev

将FILE1值与FILE2范围进行比较并打印匹配项

来自分类Dev

cmake:如果(file1 IS_NEWER_THAN file2)损坏了?

Related 相关文章

  1. 1

    如果file1的第一列与file2中的任何字符串匹配,则将其替换为file1的第二列

  2. 2

    用file1中file2第二列中的模式替换file2中第一列中的模式

  3. 3

    替换File1中的模式,并将其替换为File2中相应的匹配模式+列

  4. 4

    在file1中添加新列,该新列在参考文件file2中输出与file1中另一列的值匹配的字符串

  5. 5

    file1中第三列与file2中第一列的模式匹配

  6. 6

    如果file2中存在file1中的列值,则将file1中的所有行值添加到file2中

  7. 7

    匹配两个文件的第一列,并在Linux中的File1中合并File2的最后一列

  8. 8

    需要将一个字符串从file1替换为file2

  9. 9

    如何使用粘贴将一列从file2追加到file1

  10. 10

    Awk获取file1列并检查file2的column1,如果匹配则打印相应的值

  11. 11

    将file1中的M行替换为file2中的N行

  12. 12

    Awk - 在 file2 中找到匹配项后从 file1 调用第二个关联值

  13. 13

    Hamcrest: file1 或 file2

  14. 14

    仅比较 File1(CSV 格式)中的前 4 列与 File2 中的前 4 列并打印 File1 i 中的所有列

  15. 15

    将值从file1替换为file2 awk

  16. 16

    用file2中的相应行替换file1中的数字

  17. 17

    从file1读取行并替换file2中的行标记的最快方法

  18. 18

    将file1的行值添加到file2的列标题中

  19. 19

    有条件地将file1的行替换为file2的相应行

  20. 20

    awk将file1与file2匹配并输出匹配项

  21. 21

    删除file1在file2上存在的行

  22. 22

    如何为n列而不是3列写awk'{print $ 1 + $ 2 + $ 3} file1> file2?

  23. 23

    了解花括号对重定向的影响(“> file1>&file2”与“ {> file1;}>&file2”)

  24. 24

    了解花括号对重定向的影响(“> file1>&file2”与“ {> file1;}>&file2”)

  25. 25

    awk,读取file1中的rowS并将其输出为file2中的并行columnS

  26. 26

    Linux中两个文件的重叠,或分别用file2中的行替换file1中的行

  27. 27

    sed-使用file1查找file2中包含的替换文件3中的行

  28. 28

    将FILE1值与FILE2范围进行比较并打印匹配项

  29. 29

    cmake:如果(file1 IS_NEWER_THAN file2)损坏了?

热门标签

归档