2014-11-24 3 views
0

У меня есть несколько папок Case-1, Case-2 .... Case-N у них есть файл с именем PPD, я хочу извлечь всю вторую колонку и поставить их в один файл с именем 123.dat. Кажется, я не могу использовать awk in for loop.awk тот же столбец разных файлов в один и тот же новый файл

case=$1 
for ((i = 1; i <= $case ; i ++)) 
do 
    file=Case-$i 
    cp $file/PPD temp$i.dat 

    awk 'FNR==1{f++}{a[f,FNR]=$2} 
     END 
     {for(x=1;x<=FNR;x++) 
      {for(y=1;y<ARGC;y++) 
      printf("%s ",a[y,x]);print ""} }' 

    temp$i.dat >> 123.dat 
done 

Теперь 123.dat имеет только дату последнего PPD в случае-N

Я знаю, что я могу использовать присоединиться (я использовал эту команду раньше), если каждый файл PPD имеет по крайней мере один столбец в но это оказывается очень медленным, если у меня много папок с папками

ответ

2

Взаимодействие между внешним скриптом оболочки и внутренним вызовом awk не работает так, как вы ожидаете.

Каждый раз через петлю, сценарий оболочки вызывает awk новое время, а это значит, что f будет снят с охраной, а затем, что первый пункт будет установить его в 1. Это никогда не станет 2. То есть вы начинаете новый процесс awk для каждой итерации по внешнему циклу, и awk начинает с нуля каждый раз.

Есть другие способы структурирования коды, но как минимальная подстройка, вы можете передать количество $i в awk вызова с помощью опции -v, например, awk -v i="$i" ....

Обратите внимание, что есть более эффективные способы структурирования вашего общего решения, как уже говорили другие ответчики; Я имел в виду этот ответ, чтобы ответить на вопрос: «Почему это не работает?» а не «Пожалуйста, перепишите этот код».

+1

hi, danfuzz, не могли бы вы более точно объяснить? Я новичок в этом, я использую только Fortran каждый день. Спасибо – user3065582

+0

Немного расширил свой ответ. – danfuzz

2

Может

eval paste $(printf ' <(cut -f2 %s)' Case-*/PPD) 

Существует, вероятно, предел того, сколько процесс замены можно выполнить за один раз. Я сделал это с 20 столбцами, и все было в порядке. Подстановки процесса - это функция Bash, поэтому она не переносима для других совместимых с Bourne оболочек вообще.

Подстановочный знак будет расширен в алфавитном порядке. Если вам нужны случаи в числовом порядке, возможно, используйте case-[1-9] case-[1-9][0-9] case-[1-9][0-9][0-9], чтобы заставить расширение получить первые цифры, затем двойные цифры и т. Д.

+0

ksh93 + поддерживает замену процессов в течение длительного времени. Хороший материал в противном случае! ;-) – shellter

+0

Вот почему я осторожно положил «в общем». Спасибо за комментарий. – tripleee

+0

1+, отличное использование 'eval' и' process substitution' –

2

Программа ниже AWK может вам помочь.

#!/usr/bin/awk -f 

BEGIN { 
    # Defaults 
    nrecord=1 
    nfiles=0 
} 

BEGINFILE { 
    # Check if the input file is accessible, 
    # if not skip the file and print error. 
    if (ERRNO != "") { 
     print("Error: ",FILENAME, ERRNO) 
     nextfile 
    } 
} 

{ 
    # Check if the file is accessed for the first time 
    # if so then increment nfiles. This is to keep count of 
    # number of files processed. 
    if (FNR == 1) { 
     nfiles++ 
    } else if (FNR > nrecord) { 
     # Fetching the maximum size of the record processed so far. 
     nrecord=FNR 
    } 

    # Fetch the second column from the file. 
    array[nfiles,FNR]=$2 

} 

END { 
    # Iterate through the array and print the records. 
    for (i=1; i<=nrecord; i++) { 
     for (j=1; j<=nfiles; j++) { 
      printf("%5s", array[j,i]) 
     } 
     print "" 
    } 
} 

Выход:

$ ./get.awk Case-*/PPD 
    1 11 21 
    2 12 22 
    3 13 23 
    4 14 24 
    5 15 25 
    6 16 26 
    7 17 27 
    8 18 28 
    9 19 29 
    10 20 30 

Здесь Case*/PPD расширяется до Case-1/PPD, Case-2/PPD, Case-3/PPD, и так далее. Ниже приведены исходные файлы, для которых был создан выход.

$ cat Case-1/PPD 
1 1 1 1 
2 2 2 2 
3 3 3 3 
4 4 4 4 
5 5 5 5 
6 6 6 6 
7 7 7 7 
8 8 8 8 
9 9 9 9 
10 10 10 10 
$ cat Case-2/PPD 
11 11 11 11 
12 12 12 12 
13 13 13 13 
14 14 14 14 
15 15 15 15 
16 16 16 16 
17 17 17 17 
18 18 18 18 
19 19 19 19 
20 20 20 20 
$ cat Case-3/PPD 
21 21 21 21 
22 22 22 22 
23 23 23 23 
24 24 24 24 
25 25 25 25 
26 26 26 26 
27 27 27 27 
28 28 28 28 
29 29 29 29 
30 30 30 30 
+0

Это не приведет к смежным столбцам, а просто к выводам из разных файлов на разных последовательных строках. – tripleee

+0

спасибо, но он не может помещать данные бок о бок, моя конечная цель получит среднее значение, поэтому мой последний шаг равен $ 1 + $ 2 + ...... $ N, поэтому мне нужно поставить их рядом. – user3065582

+0

@ user3065582 Я обновил программу AWK, чтобы удовлетворить ваши потребности. Проверьте, помогает ли это. –

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