Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 如何在unix中连接文件而不进行排序_Sorting_Unix_Csv_Join - Fatal编程技术网

Sorting 如何在unix中连接文件而不进行排序

Sorting 如何在unix中连接文件而不进行排序,sorting,unix,csv,join,Sorting,Unix,Csv,Join,我正在尝试在unix中基于密钥加入2个csv文件 我的每个文件都非常大,5GB,对它们进行排序太长了 我想对50个这样的连接重复这个过程 有人能告诉我如何不排序而快速地联接吗。下面是一个示例,其中两个文件的数据由管道分隔 来自employee.csv的数据,其关键员工id、姓名和部门id由管道分隔 Employee.csv 4|John | 10 1|Monica|4 12|Louis|5 20|Peter|2 21|David|3 13|Barbara|6 部门id为且名称由管道分隔的部门文

我正在尝试在unix中基于密钥加入2个csv文件

我的每个文件都非常大,5GB,对它们进行排序太长了

我想对50个这样的连接重复这个过程


有人能告诉我如何不排序而快速地联接吗。

下面是一个示例,其中两个文件的数据由管道分隔

来自employee.csv的数据,其关键员工id、姓名和部门id由管道分隔

Employee.csv

4|John | 10
1|Monica|4
12|Louis|5
20|Peter|2
21|David|3
13|Barbara|6
部门id为且名称由管道分隔的部门文件。 部门csv

命令:

join -t “|” -1 3 -2 1 Employee_sort.csv Dept.csv
-t“|”表示的文件由管道分隔

-1 3用于文件1的第三列,即来自Employee_sort.csv文件的部门id

-2 1文件2的第一列,即Dept.csv文件中的部门id

通过使用上述命令,我们得到以下输出

2|20|Peter| Manufacturing
3|21|David| Engineering
4|1|Monica| Marketing
5|12|Louis| Sales
6|13|Barbara| Information technology
如果您想从文件2中获取所有内容以及文件1中的相应条目

您还可以使用-a和-v选项

尝试以下命令

join -t “|” -1 3 -2 1 -v2 Employee_sort.csv Dept.csv
join -t “|” -1 3 -2 1 -a2 Employee_sort.csv Dept.csv

不幸的是,没有办法进行排序。但是请看一下我在这里写的一些实用程序脚本:()。如果将列名的标题保留为每个文件的第一行,则可以使用它们。有一个脚本“tbljoin”将为您处理排序和列计数。例如,假设你有

Employee.csv:

部门csv:

department_id|department_name
1|HR
2|Manufacturing
3|Engineering
4|Marketing
5|Sales
6|Information technology
7|Security
然后命令
tbljoin Employee.csv Dept.csv
生成

employee_id|employee_name|department_id|department_name
20|Peter|2|Manufacturing
21|David|3|Engineering
1|Monica|4|Marketing
12|Louis|5|Sales
13|Barbara|6|Information technology.

制表器包含许多其他有用的功能,例如,用于简单地重新排列列。

我认为您可以避免使用join(从而对文件进行排序),但这不是一个快速的解决方案:

  • 在这两个文件中,将所有管道和所有双空格替换为空格:
  • sed-i的///g;s///g'Employee.csv Dept.csv

  • 将以下代码行作为bash脚本运行:
  • cat Employee.csv |在读取a b c时
    做
    cat Dept.csv |读取数据时
    做
    如果[“$c”-等式“$d”];然后
    echo-e“$a\t$b\t$c\t$e”
    fi
    完成
    完成

  • 请注意,循环需要很长时间

  • 我看不出它是如何回答这个问题的。您的文件已排序。询问者没有分类。
    department_id|department_name
    1|HR
    2|Manufacturing
    3|Engineering
    4|Marketing
    5|Sales
    6|Information technology
    7|Security
    
    employee_id|employee_name|department_id|department_name
    20|Peter|2|Manufacturing
    21|David|3|Engineering
    1|Monica|4|Marketing
    12|Louis|5|Sales
    13|Barbara|6|Information technology.