使用bash脚本根据一个字段提取一些行

时间:2016-04-11 21:36:34

标签: bash

我需要你的帮助才能从file1获取以下结果文件,file1非常庞大,我希望根据第一列(字段1)提取文件中的每个部分。提前谢谢。

文件1:
1111 3 4 5 7
1111 2 4 6 8
1111 1 5 9 3
1112 4 6 8 9
1112 6 8 7 7
1113 6 6 6 6
1113 7 7 7 7
......

结果
我们根据第一个字段获取所有文件,在简要文件中结果应为3个文件(file_1111,file_1112和file_1113),如下所示:
file_1111
1111 3 4 5 7
1111 2 4 6 8
1111 1 5 9 3

file_1112
1112 4 6 8 9
1112 6 8 7 7

file_1113
1113 6 6 6 6
1113 7 7 7 7

最好的问候,

H.R

2 个答案:

答案 0 :(得分:2)

试试这个测试版本:

awk '{print>>"file_" $1;}' File_1

默认情况下,awk会拆分字段$1 $2等中包含空格的行。

此单行命令将每行与当前行的第一个字段$1相关联。

测试:

$ cat File_1
1111 3 4 5 7
1111 2 4 6 8
1111 1 5 9 3
1112 4 6 8 9
1112 6 8 7 7
1113 6 6 6 6
1113 7 7 7 7

$ awk '{print>>"file_" $1;}' File_1

$ ls
File_1  file_1111  file_1112  file_1113
$ cat file_1111
1111 3 4 5 7
1111 2 4 6 8
1111 1 5 9 3
$ cat file_1112
1112 4 6 8 9
1112 6 8 7 7
$ cat file_1113
1113 6 6 6 6
1113 7 7 7 7

纯bash脚本可能会在循环中运行许多进程,我相信它应该比一个awk命令慢。

- 已编辑 - File_1是否排序无关紧要。它会起作用。

答案 1 :(得分:1)

如果数据按照显示方式排序,那么shell可以很好地完成。

while read FileField DataFields || [ "$FileField" ] ;do
  echo "$FileField $DataFields" >> "file_$FileField"
done < "$yourInputFile"

如果数据未按所示排序,则对于大型数据集,awk答案可能会更快。

...虽然文件字段在新文件中似乎毫无意义。你可能会逃脱echo "$DataFields" >> "file_$FileField"