Shell 使用awk循环来子集文件
我有一个包含很多信息的文件,我想在第一列拆分这些信息 示例(Example.gen): 期望输出: Chr1.genShell 使用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
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
变量的值相同