我希望制作包含2个或更多格式文件的表格:
05/2003 3
06/2003 2
07/2003 1
09/2003 2
10/2003 2
11/2003 2
12/2003 1
01/2004 2
02/2004 1
04/2004 2
和
01/2003 2
02/2003 2
07/2003 1
08/2003 1
09/2003 1
01/2004 2
06/2004 1
09/2004 2
10/2004 1
02/2005 3
我需要文件中的行而不是另一个文件中的行在没有行的文件的字段中插入0(可能超过2个文件)。 “加入”计划不会这样做。如果我使用“-a”选项,它将打印所有行,但不会保留列号。 “-e”选项也无济于事。输出应采用以下格式:
01/2003 0 2
02/2003 0 2
05/2003 3 0
06/2003 0 2
07/2003 1 1
08/2003 0 1
09/2003 2 1
10/2003 2 0
11/2003 2 0
12/2003 1 0
01/2004 2 2
02/2004 1 0
04/2004 2 0
06/2004 0 1
09/2004 0 2
10/2004 0 1
02/2005 0 3
从现在开始,谢谢!
奖励:如果我将来修改“join”命令的来源来执行此操作,是否可以进行封装?
答案 0 :(得分:0)
awk
救援!有分类协助......
$ awk 'NR==FNR{a[$1]=$2;f=0;next}
($1 in a){f=a[$1]; delete a[$1]}
{print $1,f,$2; f=0}
END{for(k in a) print k,a[k],0}' file1 file2 |
sort -k1.4n -k1.1,1.2n
01/2003 0 2
02/2003 0 2
05/2003 3 0
06/2003 2 0
07/2003 1 1
08/2003 0 1
09/2003 2 1
10/2003 2 0
11/2003 2 0
12/2003 1 0
01/2004 2 2
02/2004 1 0
04/2004 2 0
06/2004 0 1
09/2004 0 2
10/2004 0 1
02/2005 0 3
awk
救援!再次,这应该适用于任意数量的文件,但我没有测试超过2。
$ awk 'FNR==1{c++} {a[$1,c]=$2;keys[$1]}
END{for(k in keys)
{printf "%s", k;
for(i=1;i<=c;i++)
printf "%s", FS (((k,i) in a)?a[k,i]:0);
print ""}} ' file1 file2 |
sort -k1.4n -k1.1,1.2
01/2003 0 2
02/2003 0 2
05/2003 3 0
06/2003 2 0
07/2003 1 1
08/2003 0 1
09/2003 2 1
10/2003 2 0
11/2003 2 0
12/2003 1 0
01/2004 2 2
02/2004 1 0
04/2004 2 0
06/2004 0 1
09/2004 0 2
10/2004 0 1
02/2005 0 3
答案 1 :(得分:0)
awk 'FNR==1{n++}
{
a[$1"@"n]=$2;
b[$1]
}
END {
for ( i in b) {
printf i;
for ( x=1;x<=n;x++){
if ( i"@"x in a ){
printf " "a[i"@"x]
}
else{
printf " 0"
}
};
print ""
}
}' file1 file2| sort -n -k2,1 -t/
要计算文件编号,使用计数器n
(FNR ==1
)。
创建索引为a
的数组$1"@"n
,并为$2
(a[$1"@"n]=$2
)和数组b
分配值为$1
的数组END
在b
中:
迭代数组for ( i in b)
(for ( x=1;x<=n;x++)
),对于所有文件($2
),如果a
索引,则打印i"@"x
,即a
中的值在sort -n -k2,1 -t/
其他地方打印0。
然后根据日期(typedef enum : NSUInteger {
kCircle, // for your value; kCircle = 5, ...
kRectangle,
kOblateSpheroid
} ShapeType;
ShapeType circleShape = kCircle;
NSLog(@"%lu", (unsigned long) circleShape); // prints: 0
)