我有多个文件夹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文件夹,结果会非常慢
答案 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/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