使用join标准化文件

时间:2016-03-30 01:32:41

标签: bash awk

我希望制作包含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”命令的来源来执行此操作,是否可以进行封装?

2 个答案:

答案 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/

要计算文件编号,使用计数器nFNR ==1)。 创建索引为a的数组$1"@"n,并为$2a[$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

对其进行排序