2013-11-12 3 views
1

У меня есть файл с большим количеством фрагментов информации, которые я хочу разбить на первый столбец.Используйте awk-цикл для подмножества файла

Пример (example.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 
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 
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 
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 

Желаемый выход:

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 

Я пытался сделать это с помощью следующих сценариев оболочки, но это не работает - я не могу работать, как получить AWK распознать переменную определенную вне самого скрипта awk.

Первая попытка сценария (без AWK цикла):

for i in {1..23} 
do 
    awk '{$1 = $i}' example.gen > Chr$i.gen 
done 

Вторая попытка сценария (с петлей AWK):

for i in {1..23} 
do 
    awk '{for (i = 1; i <= 23; i++) $1 = $i}' example.gen > Chr$i.gen 
done 

Я уверен, что его, вероятно, довольно простой, но я просто не могу» t work it out ...

Спасибо!

ответ

3

С AWK:

awk '{print > "Chr"$1".gen"}' file 

он просто печатает и перенаправляет его в файл. И как этот файл определен? С "Chr" + first_column + ".gen".

С вашим вводом образца он создает 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 
3

Во-первых, используйте ответ @ fedorqui, поскольку это лучше всего. Но чтобы понять ошибку, которую вы сделали с первой попыткой (которая была близка), читайте дальше.


Ваша первая попытка потерпела неудачу, потому что вы поставили тест внутри действия (в фигурных скобках), а не перед ним. Минимальная ошибка:

awk "\$1 == $i" example.gen > Chr$i.gen 

Это использует двойные кавычки, чтобы значение i было видно по awk сценарию, но это требует, чтобы затем бежать знак доллара за $1 так, что вы не подменять значение первого позиционного аргумента оболочки. Уборщик, но дольше:

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

Это добавляет создает переменную i внутри awk сценария с тем же значением, как i переменной оболочки.

Смежные вопросы