根据列连接将大文件拆分为小的多个文件

Anu*_*nuj 0 shell perl

我有一个输入文件如下.我需要根据2,3和5列将它们分成多个文件.该文件有更多列,但我使用cut命令只获取所需的列.

12,Accounts,India,free,Internal
13,Finance,China,used,Internal
16,Finance,China,free,Internal
12,HR,India,free,External
19,HR,China,used,Internal
33,Finance,Japan,free,Internal
39,Accounts,US,used,External
14,Accounts,Japan,used,External
11,Finance,India,used,External
11,HR,US,used,External
10,HR,India,used,External
Run Code Online (Sandbox Code Playgroud)

输出文件:

Accounts_India_Internal --
12,Accounts,India,free,Internal

Finance_China_Internal --
13,Finance,China,used,Internal
16,Finance,China,free,Internal

HR_India_External --
12,HR,India,free,External
10,HR,India,used,External

HR_China_Internal --
19,HR,China,used,Internal
Run Code Online (Sandbox Code Playgroud)

等等..

请让我知道如何实现这一目标.

截至目前,我正在考虑根据这些列(2,3,5)对文件进行排序,然后在每条记录上运行循环并开始创建文件.如果文件不存在,则创建并添加记录.否则打开旧文件并添加记录.

是否可以使用shell脚本(bash)执行此操作?

Sha*_*hin 5

是否可以使用shell脚本(bash)执行此操作?

如果您只想根据字段2,3和5拆分文件,可以快速执行以下操作awk:

awk -F, '{print >> $2"_"$3"_"$5}' infile.txt 
Run Code Online (Sandbox Code Playgroud)

将每行附加到名称由字段2,3和5组成的文件.

例:

[me@home]$ awk -F, '{print >> $2"_"$3"_"$5}' infile.txt 
[me@home]$ cat Accounts_India_Internal
12,Accounts,India,free,Internal
[me@home]$ cat Finance_China_Internal
13,Finance,China,used,Internal
16,Finance,China,free,Internal
Run Code Online (Sandbox Code Playgroud)

如果您确实希望输出排序,则可以先运行该文件sort.

sort -k2,3 -k5,5 -t, infile.txt  | awk -F, '{print >> $2"_"$3"_"$5}'
Run Code Online (Sandbox Code Playgroud)

在将字段传递给awk命令之前,它会对字段2,3和5上的行进行排序.

请注意我们将附加到文件,因此如果重复命令而不删除输出文件,则最终会在输出文件中出现重复数据.要解决此问题,并在聊天中提及您的其他要求(使用第一行作为所有新文件的标题),请参阅此解决方案.

  • 那令人惊讶的酷寻找awk.你真的需要排序吗? (2认同)