用于处理三个文件的awk

时间:2014-05-12 06:34:51

标签: awk

输入:

File 1
col1 col2 col3 col4 col5 col6 col7
A     91    -    E    Abu    7    -
B     82    -    f    Anu    9    -       
C     93    -    G    Aru    8    -

File 2
col1 col2 col3 col4 col5 col6 col7
A     91    -    x    Bob    7    -
B     82    -    y    Bag    9    -       
C     93    -    z    Bui    8    -

File 3
col1 col2 col3 col4 col5 col6 col7
A     91    -    T    Can    7    -
B     82    -    U    Con    9    -       
C     93    -    V    Cuu    8    -     

预期输出:

col1 col2 col3 col4 col5
A     91  Abu  Bob  Can    
B     82  Anu  Bag  Cun           
C     93  Aru  Bui  Cuu

我有三个文件在col1和2处具有相同的数据。我需要打印所有文件的第五列以及前两列。 我能够使用两个文件。那么任何人都可以帮我处理三个或更多文件吗?

2 个答案:

答案 0 :(得分:2)

以下是使用awk的一种方式:

$ awk '
BEGIN {
    SUBSEP = FS;
    print "col1 col2 col3 col4 col5"
}
FNR>1 {
    a[$1,$2] = (a[$1,$2]?a[$1,$2]FS$5:$5)
}
END {
    for(x in a) print x, a[x]
}' file1 file2 file3
col1 col2 col3 col4 col5
C 93 Aru Bui Cuu
A 91 Abu Bob Can
B 82 Anu Bag Con

如果需要排序输出,可以将输出传递给sort限制为三个文件。它可以扩展到n个文件。只需在末尾添加文件名,或使用*对给定目录下的所有文件进行glob。

答案 1 :(得分:1)

假设由于这句话,所有三个文件都有相同的行数

  

我有三个文件在col1和2处具有相同的数据。

awk 'BEGIN{OFS="\t";
getline<"file1";getline<"file2";getline<"file3";
print "col1","col2","col3","col4","col5";
while(1) {getline < "file1";a=$1;b=$2;c=$5;getline<"file2";d=$5;f=getline<"file3";e=$5;
if(!f)exit;print a,b,c,d,e}}'  

输出:

col1    col2    col3    col4    col5
A       91      Abu     Bob     Can
B       82      Anu     Bag     Con
C       93      Aru     Bui     Cuu

这将丢弃每个文件的第一行,然后逐行读取文件,打印所需的字段。