同一列不同的文件放入同一个新文件中

时间:2014-11-24 16:13:45

标签: loops for-loop awk

我有多个文件夹Case-1,Case-2 .... Case-N,它们都有一个名为PPD的文件。我想提取所有第二列并将它们放入一个名为123.dat的文件中。 似乎我不能在for循环中使用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只有Case-N中最后一个PPD的日期

我知道我可以使用join(之前我使用过该命令),如果每个PPD文件至少有一列相同,但如果我有很多Case文件夹,结果会非常慢

3 个答案:

答案 0 :(得分:2)

外壳脚本和内部awk调用之间的交互并不像您期望的那样工作。

每次循环时,shell脚本都会调用awk一个新时间,这意味着将取消设置f,然后第一个子句将其设置为1。永远不会成为2。也就是说,您通过外部循环开始每次迭代的新awk进程,awk每次都从头开始。

还有其他方法来构建代码,但作为最小调整,您可以使用$i选项将数字awk传递给-v调用,例如awk -v i="$i" ...

请注意,正如其他回答者已经建议的那样,有更好的方法来构建整体解决方案;我的意思是这个回答是对这个问题的回答,&#34;为什么这不起作用?&#34;而不是&#34;请重写此代码。&#34;

答案 1 :(得分:2)

也许

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

您可以一次性执行多少次流程替换。我用20列做了这个,很好。进程替换是Bash功能,因此通常不能移植到其他与Bourne兼容的shell。

通配符将按字母顺序展开。如果您希望按数字顺序排列案例,可以使用case-[1-9] case-[1-9][0-9] case-[1-9][0-9][0-9]强制扩展首先获得单个数字,然后使用两位数字等。

答案 2 :(得分: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/PPDCase-2/PPDCase-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