itg*_*guy 2 unix linux bash awk split
我一直在寻找一种有效地实现这一目标的方法,并且无法提出最佳解决方案.
要求很简单.我有一个以下格式的文件.
$cat mymainfile
rec1,345,field3,....field20
rec1,645,field3,....field20
rec12,345,field3,....field20
frec23,45,field3,....field20
rec34,645,field3,....field20
Run Code Online (Sandbox Code Playgroud)
在拆分操作结束时,我希望有多个具有这些名称的单独文件
$cat some_prefix_345_some_suffix_date
rec1,345,field3,....field20
rec12,345,field3,....field20
$cat some_prefix_645_some_suffix_date
rec1,645,field3,....field20
rec34,645,field3,....field20
$cat some_prefix_45_some_suffix_date
frec23,45,field3,....field20
Run Code Online (Sandbox Code Playgroud)
我想过使用grep,但它必须找到唯一的id然后grep为每个,因为我们不知道在读取之前文件中的id(345,645等)mymainfile.
然后我想到csplit这里例如这里基于分隔符将一个文件拆分成多个文件但是它基于分隔符而不是特定列分割.
当谈到bash脚本时,我知道我可以使用a逐行读取while loop并拆分它但不知道它是否会有效.
我也想过awk像awk '$2 == ? {等等的解决方案,但不知道如何获得这些不同的文件名.我可以使用python以编程方式执行它,但更喜欢单个命令行,我知道这是可能的.我厌倦了搜索,但仍然无法找到最佳方法.任何建议/最佳方法将不胜感激.
在awk中,您可以将每行的输出重定向到动态构建其名称的其他文件(基于$2此情况):
$ awk -F, '{print > ("some_prefix_" $2 "_some_suffix_date")}' file
$ ls *_date
some_prefix_345_some_suffix_date some_prefix_45_some_suffix_date some_prefix_645_some_suffix_date
$ cat some_prefix_345_some_suffix_date
rec1,345,field3,....field20
rec12,345,field3,....field20
$ cat some_prefix_645_some_suffix_date
rec1,645,field3,....field20
rec34,645,field3,....field20
$ cat some_prefix_45_some_suffix_date
frec23,45,field3,....field20
Run Code Online (Sandbox Code Playgroud)
正如评论中指出的那样,如果您有许多不同的值,$2并且您收到太多打开文件的错误,您可以随时关闭:
$ awk -F, '{fname = "xsome_prefix_" $2 "_some_suffix_date"
if (a[fname]++) print >> fname; else print > fname;
close fname}' file
Run Code Online (Sandbox Code Playgroud)