Shell 使用awk循环来子集文件

Shell 使用awk循环来子集文件,shell,loops,awk,Shell,Loops,Awk,我有一个包含很多信息的文件,我想在第一列拆分这些信息 示例(Example.gen): 期望输出: Chr1.gen 1 rs3094315 752566 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1 1 rs2094315 752999 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1 Chr2.gen 2 rs3044315 759996 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1 2 rs3054375 799966 A G 0 1 0

我有一个包含很多信息的文件,我想在第一列拆分这些信息

示例(Example.gen):

期望输出:

Chr1.gen

1 rs3094315 752566 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1
1 rs2094315 752999 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1
Chr2.gen

2 rs3044315 759996 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1
2 rs3054375 799966 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1
2 rs3094375 999566 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1
Chr3.gen

3 rs3078315 799866 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1
3 rs4054315 759986 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1
Chr4.gen

4 rs4900215 752998 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1
4 rs5094315 759886 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1
4 rs6094315 798866 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1
我曾尝试使用以下shell脚本来实现这一点,但它不起作用-我不知道如何让awk识别在awk脚本本身之外定义的变量

第一次脚本尝试(无awk循环):

第二次脚本尝试(使用awk循环):

{1..23}中i的

做
awk'{for(i=1;i与awk:

awk '{print > "Chr"$1".gen"}' file
它只是打印并重定向到一个文件。这个文件是如何定义的?使用
“Chr”+first_column+“.gen”

使用示例输入创建4个文件。例如,第4个文件是:

$ cat Chr4.gen 
4 rs4900215 752998 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1
4 rs5094315 759886 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1
4 rs6094315 798866 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1
使用awk:

awk '{print > "Chr"$1".gen"}' file
它只是打印并重定向到一个文件。这个文件是如何定义的?使用
“Chr”+first_column+“.gen”

使用示例输入创建4个文件。例如,第4个文件是:

$ cat Chr4.gen 
4 rs4900215 752998 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1
4 rs5094315 759886 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1
4 rs6094315 798866 A G 0 1 0 1 0 0 1 0 0 0 1 0 0 1

首先,使用@fedorqui的答案,因为这是最好的答案。但是要理解你第一次尝试时犯的错误(非常接近),请继续阅读


您的第一次尝试失败,因为您将测试放在操作内部(大括号中),而不是前面。最小修复:

awk "\$1 == $i" example.gen > Chr$i.gen
这使用双引号来允许
awk
脚本看到
i
的值,但这要求您随后转义
$1
的美元符号,以便不替换shell的第一个位置参数的值。更简洁但更长:

awk -v i=$i '$1 == i' example.gen > Chr$i.gen

这将在
awk
脚本中创建一个变量
i
,该变量的值与shell的
i
变量的值相同。

首先,使用@fedorqui的答案,因为这是最好的。但是要理解您在第一次尝试中犯下的错误(非常接近),请继续阅读


您的第一次尝试失败,因为您将测试放在操作内部(大括号中),而不是前面。最小修复:

awk "\$1 == $i" example.gen > Chr$i.gen
这使用双引号来允许
awk
脚本看到
i
的值,但这要求您随后转义
$1
的美元符号,以便不替换shell的第一个位置参数的值。更简洁但更长:

awk -v i=$i '$1 == i' example.gen > Chr$i.gen
这将在
awk
脚本中创建一个变量
i
,该变量的值与shell的
i
变量的值相同