【问题标题】:match column1,column2 in two files匹配两个文件中的 column1,column2
【发布时间】:2020-06-11 17:15:50
【问题描述】:

我有两个文件 file1.csv 和 file2.csv

file1.csv
Test1;Test3
Test1;Test3
Test1;Test3
Test1;Test3
Test1;Test3
Test1;Test3
Test1;Test3
Test7;Test4
Test7;Test4
Test7;Test4
Test7;Test4
Test7;Test4
Test7;Test4
Test7;Test4



file2.csv
Test1;Test3;12345
Test1;Test3;12345
Test1;Test3;12345
Test1;Test3;12345
Test1;Test3;12345
Test1;Test3;12345
Test1;Test3;12345
Test7;Test4;12346
Test7;Test4;12346
Test7;Test4;12346
Test7;Test4;12346
Test7;Test4;12346
Test7;Test4;12346
Test7;Test4;12346

我正在尝试循环 file1.csv 并与 file2.csv 中的相同匹配,因为它会匹配它应该获取输出并将其打印在一个新文件中 因此,如果两个文件中的 column1 和 column2 相同,则打印出一个新文件,但如果匹配,则将其限制为每个 3 行。

awk 'NR==FNR{a[$1,$2];next}($1,$2 in a){print $0}' identicalValue.csv Originalvalues.csv | head -3

输出应该是:

  Test1;Test3;12345
  Test1;Test3;12345
  Test1;Test3;12345
  Test7;Test4;12346
  Test7;Test4;12346
  Test7;Test4;12346

自文件1.csv

Test1;Test3
Test1;Test3
Test1;Test3
Test1;Test3
Test1;Test3
Test1;Test3
Test1;Test3
Test7;Test4
Test7;Test4
Test7;Test4
Test7;Test4
Test7;Test4
Test7;Test4
Test7;Test4

等于 file2.csv

    Test1;Test3;12345
    Test1;Test3;12345
    Test1;Test3;12345
    Test1;Test3;12345
    Test1;Test3;12345
    Test1;Test3;12345
    Test1;Test3;12345
    Test7;Test4;12346
    Test7;Test4;12346
    Test7;Test4;12346
    Test7;Test4;12346
    Test7;Test4;12346
    Test7;Test4;12346
    Test7;Test4;12346

在第 1 列第 2 列中,它应该只打印出 file2.csv 中第 1 列和第 2 列中每个匹配项的 3 个值

【问题讨论】:

  • 在示例中,您显示所有行都匹配?你能举一个不匹配的例子吗? “每场比赛 3 行”是什么意思?你能根据你提供的输入显示你想要得到的输出吗?

标签: awk


【解决方案1】:

编辑:由于 OP 在他/她的文件中有控制 M 个字符,因此添加此解决方案来处理它。

awk 'BEGIN{FS=";"} {gsub(/\r/,"")} FNR==NR{a[$1,$2];next} (($1,$2) in a) && ++b[$1,$2]<=3' file1 file2


如果您想打印 Input_file2 的内容并匹配 Input_file1 中的行,请尝试以下操作,这也会将每列值的匹配计数保持为 3

awk 'BEGIN{FS=";"} FNR==NR{a[$1,$2];next} (($1,$2) in a) && ++b[$1,$2]<=3'  file1  file2

上面将只打印每个索引的 3 个值,如果您想打印索引的所有值,请尝试以下操作。

awk 'BEGIN{FS=";"} FNR==NR{a[$1,$2];next} (($1,$2) in a)'  file1  file2

输出如下。

Test1;Test3;12345
Test1;Test3;12345
Test1;Test3;12345
Test7;Test4;12346
Test7;Test4;12346
Test7;Test4;12346

【讨论】:

  • 嗨,结果不符合预期,因为 awk 'BEGIN{FS=";"} FNR==NR{a[$1,$2];next} (($1,$2) in a) && ++b[$1,$2]
  • @Leon2020,但是您提到您只需要为每个第一个和第二个字段设置 3 个值,不是吗?
  • 每个匹配 3 个值
  • @Leon2020,是的,在我的第一个解决方案中已经解决了这个问题,请问您是否对此有疑问?
  • 第一个解决方案只打印出 3 个值,但在我的文件中它的匹配更多,但其他值也应该匹配,例如 Test1;Test3;12345 Test1;Test3;12345 Test1;Test3; 12345 但不是 Test1;Test3;12345 Test1;Test3;12345 Test1;Test3;12345 Test7;Test4;12346 Test7;Test4;12346 Test7;Test4;12346
猜你喜欢
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多